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:无法创建表

JPA/Hibernate 本机查询无法识别参数

大家有没有遇到使用spring data jpa hibernate无法自动写入时间戳的问题?

Spring Boot ManyToMany - *** - JPA,Hibernate

无法构建 Hibernate SessionFactory - spring data/jpa/hibernate 逆向工程

JPA 2 / Hibernate 孤儿删除仍然无法与@OneToMany 一起使用?