当前位置: 首页 > 面试题库 >

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

单于奕
2023-03-14
问题内容

我有一个奇怪的问题。但是首先是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实现中的错误?

感谢和干杯儿


问题答案:

该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,建议您使用便携式解决方案。



 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 问题内容: @Entity public class Person { 给定以下类结构,当我尝试将新位置添加到“人的位置”列表中时,它总是导致以下SQL查询: 和 Hibernate(3.5.x / JPA 2)删除给定Person的所有关联记录,然后重新插入所有以前的记录以及新的记录。 我有一个想法,即Location上的equals / hashcode方法可以解决此问题,但是它没有任何改变。

  • 为什么我得到一个空的输出?当我删除xml中的xmlns部分时,输出是预期的,但是intellisense不再工作了。 仓库xml 仓库xsl

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处