我遇到了一个奇怪的问题。但首先是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 [选择 repeat0_.id为id8_, repeat0_.id_repeatType为id2_8_, repeat0_.id_trainingSet as id3_8_ from 重复repeat0 _];
然而,改变
<table name="repeat"/>
到
<table name="repeatt"/>
解决了MySQL的问题。
有什么问题? “重复”是保留关键字还是Hibernate的JPA实现中的错误?
谢谢&amp;干杯 尔
答案 0 :(得分:4)
SQL Reserved Words Checker告诉我"repeat"是MySQL(和DB2)的保留SQL关键字,所以你需要转义它。
JPA 1.0没有定义处理它的标准方法,所以你必须使用依赖反引号的Hibernate解决方案。来自Hibernate参考指南:
5.4. SQL quoted identifiers
你可以强制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时,使用double将名称指定为分隔标识符 引号,例如
<table name=""customer""/>
如果您使用的是JPA 2.0,我建议您使用便携式解决方案。
答案 1 :(得分:1)
是的,重复是MySQL中的保留字