代码之家  ›  专栏  ›  技术社区  ›  TJR

用JPA创建保留字名称的字段

  •  64
  • TJR  · 技术社区  · 14 年前
    @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在创建表时使用带引号的标识符。

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

    7 回复  |  直到 5 年前
        1
  •  35
  •   Rafiek    5 年前

    有同样的问题,但是有一个名为 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
  •  115
  •   Community noseratio    7 年前

    使用Hibernate作为JPA 1.0提供程序,您可以通过将保留关键字包含在倒计时内来转义它:

    @Column(name="`open`")
    

    这是从hiberate core继承的语法:

    5.4. SQL quoted identifiers

    您可以强制Hibernate引用 生成的SQL中的标识符 将表或列名称封闭在 映射文档中的倒计时。 休眠将使用正确的 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>
    

    在JPA2.0中,语法是标准化的,并且变成:

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

    工具书类

    相关问题

        3
  •  14
  •   abatishchev Marc Gravell    14 年前

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

    @Column(name="[order]")
    private int order;
    
        4
  •  10
  •   wmnitin David    9 年前
    @Column(name="\"open\"")
    

    这肯定能奏效,当我学习冬眠时,我也遇到了同样的问题。

        5
  •  3
  •   Bozho    14 年前

    否-更改列名称。

    这是特定于数据库的,您不能创建这样的列。在所有休眠之后,最终将DDL发送到数据库。如果不能用这个列名创建有效的DDL,这意味着Hibernate也不能。我认为即使你在写DDL,引用也不能解决这个问题。

    即使你以某种方式成功地摆脱了这个名字——改变它。它将与此数据库一起工作,但不会与其他数据库一起工作。

        6
  •  0
  •   Neil Stockton Mheboob Bloch    9 年前

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

        7
  •  0
  •   Vlad Mihalcea    5 年前

    手动转义保留关键字

    如果使用JPA,可以用双引号转义:

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

    如果您使用的是Hibernate本机API,那么可以使用反勾号对其进行转义:

    @Column(name = "`open`")
    

    自动转义保留关键字

    如果要自动查找保留关键字,可以将设置为 true 特定于休眠的 hibernate.globally_quoted_identifiers 配置属性:

    <property
        name="hibernate.globally_quoted_identifiers"
        value=true"
    />
    

    有关详细信息,请查看 this article .