【问题标题】:Hibernate with MS SQL使用 MS SQL 休眠
【发布时间】:2014-07-26 01:47:47
【问题描述】:

我正在尝试将 hibernate 与 MS SQL 集成,下面是我从 hibernate 获得的 sql 查询

12:27:44,172 DEBUG [AbstractSaveEventListener] Executing identity-insert immediately
Hibernate: 
    insert 
    into
        aide.dbo.rule
        (appId, ruleName) 
    values
        (?, ?)

导致错误

12:27:44,229 DEBUG [SqlExceptionHelper] Incorrect syntax near the keyword 'rule'. [n/a]
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'rule'.

MS SQL 管理工作室也出现同样的错误

虽然这个命令运行良好

 insert 
    into
        [aide].[dbo].[rule]
        (appId, ruleName) 
    values
        ('rf', 'wfw')

下面是我的休眠配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- <property name="hibernate.bytecode.use_reflection_optimizer">false</property> -->
        <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433</property>
        <property name="hibernate.default_catalog">aide</property>
        <property name="hibernate.default_schema">dbo</property>
        <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="hibernate.connection.username">aide</property>
        <property name="hibernate.connection.password">aide</property>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
        <property name="hibernate.show_sql">true</property><!-- JDBC connection pool (use the 
            built-in) -->
        <property name="hibernate.connection.pool_size">1</property>
        <!-- Drop and re-create the database schema on startup -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.format_sql">true</property>

        <mapping class="com.****.Rule" />

        <!-- <mapping resource="com/****/Rules.hbm.xml"></mapping> -->
    </session-factory>
</hibernate-configuration>

(从微软网站下载的sqljdbc4.jar) 似乎休眠正在生成 MS SQL 无法理解的查询

【问题讨论】:

  • 不,你是。通过使用关键字“规则”作为名称。该错误已经告诉您:“关键字'规则'附近的语法不正确”。但你没有在听。
  • OP 的措辞是合法的。在某些情况下,使用保留关键字作为表名是有充分理由的,并且几乎每个 DBMS 都允许使用某种形式的转义。导致我(可能还有 OP)的问题是如何在休眠的上下文中最好地做到这一点。我有一个支持多个 DBMS 的硬性要求,必须将 SQL Server 支持添加到现有的实体结构中,并且需要一种我必须支持的所有实体都能理解的转义形式。在我必须支持的任何其他 DBMS 中,表名都不是保留关键字。

标签: java sql-server hibernate jpa orm


【解决方案1】:

RULE 是 SQL Server 保留的keyword

如果您需要坚持使用该名称,则需要使用以下命令对其进行转义:

@Table(name="`rule`")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2014-03-02
    • 2012-12-05
    • 2010-12-17
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多