我有一个奇怪的问题。但是首先是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>
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。
orm.xml
JPA 2.0更进一步,并定义了一种指定分隔标识符的方法:
2.13数据库对象的命名 … 要指定分隔标识符,必须使用以下方法之一: 通过在对象/关系xml映射文件<delimited-identifiers/>的persistence-unit- defaults元素中指定元素,可以将用于持久性单元的所有数据库标识符指定为定界标识符。如果<delimited- identifiers/>指定了元素,则不能覆盖它。 可以按名称指定将数据库对象的名称解释为带分隔符的标识符,如下所示: * 使用注释,通过将名称用双引号引起来将名称指定为带分隔符的标识符,从而对内部引号进行转义,例如@Table(name="\"customer\"")。 使用XML时,使用双引号将名称指定为带分隔符的标识符,例如, <table name=""customer""/>
…
要指定分隔标识符,必须使用以下方法之一:
<delimited-identifiers/>
persistence-unit- defaults
<delimited- identifiers/>
@Table(name="\"customer\"")
<table name=""customer""/>
如果您使用的是JPA 2.0,建议您使用便携式解决方案。