一尘不染

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

java

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

除了重命名字段外,还有其他任何处理方法的想法吗?


阅读 642

收藏
2020-03-03

共2个答案

一尘不染

遇到相同的问题,但表名为Transaction。如果你设定

hibernate.globally_quoted_identifiers=true

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

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

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

虽然找不到更好的文档。

就我而言,该设置位于我的Spring属性文件中。如注释中所述,它也可以位于其他与hibernate相关的配置文件中。

2020-03-03
一尘不染

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

@Column(name="`open`")

这是从Hiberate Core继承的语法:

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\"")
2020-03-03