使用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)会自动为您引用标识符,所以您永远不会得到这个。