@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在创建表时使用带引号的标识符。
关于如何处理这个问题的任何想法...除了重命名字段?
答案 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)会自动为你引用标识符,所以你永远不会得到它。