Hibernate,MySQL和表名为“重复” – 奇怪的行为

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

 

我使用Hibernate / JPA。 使用HSQL和Derby,一切运行良好,所以我的BO,DAO和unit testing必须正常。 使用MySQL进行测试时,出现此错误:

org.springframework.dao.InvalidDataAccessResourceUsageException:无法执行查询; SQL [select repeat0_.id as id8_,repeat0_.id_repeatType as id2_8_,repeat0_.id_trainingSet as id3_8_ from repeat repeat0_];

但是,改变

 

 

解决了MySQL的问题。

哪里不对? “重复”是一个保留关键字还是Hibernate的JPA实现中的一个错误?

谢谢和干杯

SQL保留字检查器告诉我“repeat”是MySQL(和DB2)的保留SQL关键字,因此您需要将其转义。

JPA 1.0没有定义处理它的标准方法,所以你必须使用依赖反引号的Hibernate解决方案。 从Hibernate参考指南:

5.4。 SQL引用的标识符

您可以强制Hibernate通过在映射文档中的反引号中包含表或列名称来在生成的SQL中引用标识符。 Hibernate将为SQL Dialect使用正确的引用样式。 这通常是双引号,但SQL Server使用括号,MySQL使用反引号。

    ...  

假设这也适用于orm.xml

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

2.13数据库对象的命名

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

  • 通过在对象/关系xml映射文件的persistence-unit-defaults元素中指定元素,可以指定将持久性单元使用的所有数据库标识符视为分隔标识符。 如果指定了元素,则无法覆盖它。
  • 可以在每个名称的基础上指定数据库对象的名称将被解释为分隔标识符,如下所示:
    • 使用注释,通过将名称括在双引号内来将名称指定为分隔标识符,从而对内部引号进行转义,例如@Table(name="\"customer\"")
    • 使用XML时,使用双引号将名称指定为分隔标识符,例如

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

是的,重复是MySQL中的保留字

http://dev.mysql.com/doc/refman/5.7/en/keywords.html