JPA/Hibernate 无法创建名为 Order 的实体
Posted
技术标签:
【中文标题】JPA/Hibernate 无法创建名为 Order 的实体【英文标题】:JPA/Hibernate can't create Entity called Order 【发布时间】:2011-04-05 17:10:03 【问题描述】:我正在使用 Hibernate/JPA 并有一个名为 Order 的 @Entity 对象,它使用 Hibernate 的动态表生成指向 mysql 数据库,即在运行时为实体生成表。当 Hibernate 创建表时,它会为我的所有实体创建表,但 Order 实体除外。如果我将 Order 实体重命名为其他名称,例如StoreOrder,store_order表创建没问题。
此外,如果我这样做但随后注释 StoreOrder 对象以指定它应该创建的表使用 @Table (name="order") 称为“订单”,则不再创建该表。
我知道 order 是保留字,但这是它无法创建表的原因吗?考虑到Hibernate docs 使用了一个名为 Order 的实体示例,这似乎很奇怪。
这看起来不像是 MySQL 的问题,因为我可以直接在数据库上手动创建一个名为 order 的表。
这里是相关的订单实体对象定义...
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity
... rest of POJO def...
...以及对应的 Persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="store" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<mapping-file>conf/jpa/persistence-query.xml</mapping-file>
<!-- Entities -->
...other entities...
<class>ie.wtp.store.model.Order</class>
<class>ie.wtp.store.model.OrderItem</class>
<!-- Hibernate properties -->
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/store"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>
<property name="hibernate.query.substitutions" value="true 1, false 0"/>
<property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
关于为什么这个 Order 实体没有被创建但是如果我将它重命名为 StoreOrder 就会被创建有什么想法吗?
干杯,
J :)
【问题讨论】:
相关问题:***.com/questions/3364835/… 【参考方案1】:可能是因为 'Order' 是 SQL 中的关键字。当我遇到这种情况时,我通常只是在我的实体/表名称的末尾加上“Tbl”以避免潜在的冲突。
【讨论】:
【参考方案2】:ORDER
字是保留关键字,您必须对其进行转义。
在 JPA 1.0 中,没有标准化的方法,Hibernate 的具体解决方案是使用反引号:
@Entity
@Table(name="`Order`")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity
... rest of POJO def...
JPA 2.0 对此进行了标准化,语法如下所示:
@Entity
@Table(name="\"Order\"")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity
... rest of POJO def...
参考文献
休眠核心文档 5.4. SQL quoted identifiers JPA 2.0 规范 2.13 数据库对象的命名【讨论】:
以上是关于JPA/Hibernate 无法创建名为 Order 的实体的主要内容,如果未能解决你的问题,请参考以下文章
Play + JPA + Hibernate + PostgreSQL:无法创建表
大家有没有遇到使用spring data jpa hibernate无法自动写入时间戳的问题?
Spring Boot ManyToMany - *** - JPA,Hibernate
无法构建 Hibernate SessionFactory - spring data/jpa/hibernate 逆向工程