使用JPA创build具有保留字名称的字段

@Column(name="open") 

用hibernate的sqlserver方言。

 [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在创build表时使用带引号的标识符。

任何想法如何处理这个…除了重命名字段?

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

 hibernate.globally_quoted_identifiers=true 

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

在这里find我的答案表名hibernate中的特殊字符给出错误

并find所有可用的设置在这里https://docs.jboss.org/hibernate/orm/5.2/javadocs/

找不到更好的文档。

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

 @Column(name="`open`") 

这是从Hiberate Coreinheritance的语法:

5.4。 SQL引用的标识符

您可以强制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\"") 

参考

  • Hibernate参考指南
    • 5.4。 SQL引用的标识符
  • JPA 2.0规范
    • 2.13数据库对象的命名

相关问题

  • hibernate,MySQL和表名为“重复” – 奇怪的行为
  • 为Hibernate表和列自动保留字转义

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

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

否 – 更改列名称。

这是数据库特定的,你不能创build这样的列。 毕竟,hibernate最后发送DDL到数据库。 如果你不能用这个列名创build一个有效的DDL,这意味着hibernate不能。 即使您正在编写DDL,我也不认为引用可以解决问题。

即使你以某种方式成功逃脱这个名字 – 改变它。 它将与这个数据库一起工作,但不会与另一个工作。

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

这肯定会起作用,当我学习hibernate的时候,也出现了同样的问题。

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