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

TJR*_*TJR 76 java sql-server orm hibernate jpa

@Column(name="open")
Run Code Online (Sandbox Code Playgroud)

使用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'.
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*ent 123

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

@Column(name="`open`")
Run Code Online (Sandbox Code Playgroud)

这是从Hiberate Core继承的语法:

5.4.SQL引用的标识符

您可以强制Hibernate通过在映射文档中的反引号中包含表或列名称来在生成的SQL中引用标识符.Hibernate将为SQL Dialect使用正确的引用样式.这通常是双引号,但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>
Run Code Online (Sandbox Code Playgroud)

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

@Column(name="\"open\"")
Run Code Online (Sandbox Code Playgroud)

参考

相关问题

  • 我不明白为什么我要这样做,为什么Hibernate不会自动而不是我? (5认同)

Raf*_*iek 45

有同样的问题,但有一个名字叫Transaction.如果你设置

hibernate.globally_quoted_identifiers=true
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是找不到更好的文档.

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

  • 这不是默认设置吗? (4认同)
  • 好的。与不适合的名称相比,我更喜欢使用转义的保留字作为一整天的名称。 (3认同)
  • 对于那些想知道该在哪里设置的人,它可能在JBoss项目的`persistence.xml`中。 (2认同)

小智 15

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

@Column(name="[order]")
private int order;
Run Code Online (Sandbox Code Playgroud)

  • 这是特定于sqlserver的。 (2认同)

Ahm*_*our 12

还有另一个选项:hibernate.auto_quote_keyword

哪个

指定是否自动引用任何被视为关键字的名称。

<property name="hibernate.auto_quote_keyword" value="true" />
Run Code Online (Sandbox Code Playgroud)

亚米尔

spring:
  jpa:
    properties:
      hibernate:
        auto_quote_keyword: true
Run Code Online (Sandbox Code Playgroud)

  • 我发现这比 global_quoted_identifiers 更好,因为它只引用保留关键字而不是每个标识符。 (2认同)

wmn*_*tin 10

@Column(name="\"open\"")
Run Code Online (Sandbox Code Playgroud)

这肯定会起作用,当我学习hibernate时,同样的问题发生在我身上.


Vla*_*cea 5

手动转义保留的关键字

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

@Column(name = "\"open\"")
Run Code Online (Sandbox Code Playgroud)

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

@Column(name = "`open`")
Run Code Online (Sandbox Code Playgroud)

自动转义保留关键字

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

@Column(name = "\"open\"")
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看本文