使用JPA创建带有保留字名称的字段

时间:2010-02-08 20:06:27

标签: java sql-server hibernate orm jpa

@Column(name="open")

将sqlserver方言与hibernate一起使用。

[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.

我希望hibernate在创建表时使用带引号的标识符。

关于如何处理这个问题的任何想法...除了重命名字段?

7 个答案:

答案 0 :(得分:117)

使用Hibernate作为JPA 1.0提供程序,您可以通过将其保留在反引号中来转义保留关键字:

@Column(name="`open`")

这是从Hiberate Core继承的语法:

  

5.4. SQL quoted identifiers

     

你可以强制Hibernate引用一个   生成的SQL中的标识符   将表或列名括在中   映射文档中的反引号。   Hibernate会使用正确的   SQL方言的引用样式。   这通常是双引号,但是   SQL Server使用括号和MySQL   使用反引号。

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

在JPA 2.0中,语法标准化并变为:

@Column(name="\"open\"")

参考

相关问题

答案 1 :(得分:38)

有同样的问题,但有一个名为Transaction的表名。如果你设置

hibernate.globally_quoted_identifiers=true

然后将引用所有数据库标识符。

在这里找到我的答案 Special character in table name hibernate giving error

并在此处找到所有可用设置 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

虽然找不到更好的文档。

在我的情况下,设置在我的Spring属性文件中。正如评论中所提到的,它也可以在其他与休眠相关的配置文件中。

答案 2 :(得分:15)

如果您使用如下所示它应该工作

@Column(name="[order]")
private int order;

答案 3 :(得分:10)

@Column(name="\"open\"")

这肯定会有用,当我学习休眠时,同样的问题发生在我身上。

答案 4 :(得分:4)

否 - 更改列名称。

这是特定于数据库的,您无法创建此类列。毕竟hibernate最终将DDL发送到数据库。如果您无法使用此列名创建有效的DDL,则这意味着hibernate也不能。即使您正在编写DDL,我也不认为引用会解决问题。

即使你以某种方式成功逃脱了这个名字 - 改变它。它将与此数据库一起使用,但不能与其他数据库一起使用。

答案 5 :(得分:3)

手动转义保留关键字

如果您使用的是JPA,则可以使用双引号进行转义:

@Column(name = "\"open\"")

如果您使用的是Hibernate本机API,则可以使用反引号将其转义:

@Column(name = "`open`")

自动转义保留关键字

如果要自动转义保留的关键字,可以将特定于Hibernate的true配置属性设置为hibernate.globally_quoted_identifiers

<property
    name="hibernate.globally_quoted_identifiers"
    value=true"
/>

有关更多详细信息,请查看my article

答案 6 :(得分:0)

一些JPA实现(例如我使用的那个,DataNucleus)会自动为你引用标识符,所以你永远不会得到它。