Java Hibernate、MySQL和名为;重复";-奇怪的行为

Java Hibernate、MySQL和名为;重复";-奇怪的行为,java,mysql,hibernate,orm,jpa,Java,Mysql,Hibernate,Orm,Jpa,我有一个奇怪的问题。但首先是orm.xml: <entity class="de.test.businessobjects.Repeat"> <table name="repeat"/> <attributes> <id name="id"> <generated-value strategy="TABLE"/> </id> <ma

我有一个奇怪的问题。但首先是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[选择] 将0.id重复为id8, repeat0_uu.id_urepeatType为id2_u8_u, 重复0.id\u培训设置为id3\u 8\u from 重复[0]

然而,改变

<table name="repeat"/>


解决了MySQL的问题

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

谢谢,干杯 Er

告诉我,这是MySQL(和DB2)的保留SQL关键字,因此需要对其进行转义

JPA1.0没有定义一种标准的方法来处理这个问题,所以您必须使用Hibernate解决方案,该解决方案依赖于backticks。从Hibernate参考指南:

您可以强制Hibernate引用 由生成的SQL语句中的标识符 将表名或列名包含在 映射文档中的反勾号。 Hibernate将使用正确的 SQL方言的引号样式。 这通常是双引号,但 SQLServer使用括号和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映射文件的
    持久化单元默认值
    元素中指定
    元素,可以指定将用于持久化单元的所有数据库标识符视为分隔标识符。如果指定了
    元素,则无法重写它
  • 可以在每个名称的基础上指定将数据库对象的名称解释为分隔标识符,如下所示:
    • 使用注释,通过将名称括起来,将名称指定为分隔标识符 在双引号中,内部引号被转义,例如,
      @Table(name=“\”customer\”)
    • 在使用XML时,使用double将名称指定为分隔标识符 引号,例如,
如果您使用的是JPA2.0,我建议您使用可移植的解决方案。

告诉我这是MySQL(和DB2)的保留SQL关键字,因此您需要转义它

JPA1.0没有定义一种标准的方法来处理这个问题,所以您必须使用Hibernate解决方案,该解决方案依赖于backticks。从Hibernate参考指南:

您可以强制Hibernate引用 由生成的SQL语句中的标识符 将表名或列名包含在 映射文档中的反勾号。 Hibernate将使用正确的 SQL方言的引号样式。 这通常是双引号,但 SQLServer使用括号和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映射文件的
    持久化单元默认值
    元素中指定
    元素,可以指定将用于持久化单元的所有数据库标识符视为分隔标识符。如果指定了
    元素,则无法重写它
  • 可以在每个名称的基础上指定将数据库对象的名称解释为分隔标识符,如下所示:
    • 使用注释,通过将名称括起来,将名称指定为分隔标识符 在双引号中,内部引号被转义,例如,
      @Table(name=“\”customer\”)
    • 在使用XML时,使用double将名称指定为分隔标识符 引号,例如,

如果您使用的是JPA2.0,我建议您使用便携式解决方案。

是的,repeat在MySQL中是一个保留字


是的,repeat在MySQL中是一个保留字

完全无关:[无意冒犯]完全无关:[无意冒犯]