一尘不染

Hibernate,MySQL和名为“ Repeat”的表-奇怪的行为

mysql

我有一个奇怪的问题。但是首先是orm.xml:

<entity class="de.test.businessobjects.Repeat">
    <table name="repeat"/>
    <attributes>
        <id name="id">
            <generated-value strategy="TABLE"/>
        </id>
        <many-to-one name="repeatType" fetch="LAZY">
            <join-column name="id_repeatType"/>
        </many-to-one>
        <many-to-one name="trainingSet" fetch="LAZY">
            <join-column name="id_trainingSet"/>
        </many-to-one>
    </attributes>
</entity>

我使用Hibernate / JPA。使用HSQL和Derby可以正常运行,因此我的BO,DAO和单元测试必须没问题。使用MySQL测试时,出现此错误:

org.springframework.dao.InvalidDataAccessResourceUsageException:无法执行查询;SQL
[从repeat
repeat0_中选择repeat0_.id作为id8_,repeat0_.id_repeatType作为id2_8_,repeat0_.id_trainingSet作为id3_8_];

但是,改变

<table name="repeat"/>

<table name="repeatt"/>

解决了MySQL的问题。

怎么了?“ repeat”是保留关键字,还是Hibernate的JPA实现中的错误?

感谢和干杯儿


阅读 224

收藏
2020-05-17

共1个答案

一尘不染

SQL保留字检查告诉我,“重复”是与MySQL(和DB2),所以你需要逃避它保留SQL关键字。

JPA 1.0并未定义处理该问题的标准方法,因此您必须使用依赖于反引号的Hibernate解决方案。从《 Hibernate参考指南》中:

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>

认为 这也会起作用orm.xml

JPA 2.0更进一步,并定义了一种指定分隔标识符的方法:

2.13数据库对象的命名

要指定分隔标识符,必须使用以下方法之一:

  • 通过在对象/关系xml映射文件<delimited-identifiers/>persistence-unit- defaults元素中指定元素,可以将用于持久性单元的所有数据库标识符指定为定界标识符。如果<delimited- identifiers/>指定了元素,则不能覆盖它。
  • 可以按名称指定将数据库对象的名称解释为带分隔符的标识符,如下所示:
    * 使用注释,通过将名称用双引号引起来将名称指定为带分隔符的标识符,从而对内部引号进行转义,例如@Table(name="\"customer\"")
    • 使用XML时,使用双引号将名称指定为带分隔符的标识符,例如, <table name="&quot;customer&quot;"/>

如果您使用的是JPA 2.0,建议您使用便携式解决方案。

2020-05-17