JPA/Hibernate 无法创建名为 Order 的实体

12
我正在使用Hibernate/JPA,有一个名为Order的@Entity对象,使用Hibernate的动态表生成指向MySQL数据库,即为实体在运行时生成表。当Hibernate创建表时,除了Order实体之外,它会为所有实体创建表。如果我将Order实体重命名为其他名称,例如StoreOrder,则store_order表可以轻松创建。
此外,如果我这样做,但使用@Table (name="order")注释StoreOrder对象以指定应创建的表称为“order”,则不再创建该表。
我意识到order是一个保留字,但这是无法创建表的原因吗?鉴于Hibernate文档使用了一个名为Order的实体的示例,这似乎很奇怪。
看起来不像是MySQL的问题,因为我可以在数据库上直接手动创建一个名为order的表。
以下是相关的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>

你有什么想法,为什么这个订单实体没有被创建,但如果我将它重命名为StoreOrder,则会被创建?

干杯,

J :)


相关问题:https://dev59.com/JHA75IYBdhLWcg3wT3P8 - Don Roby
2个回答

23

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...
}

参考文献


1

可能是因为“Order”是SQL中的关键字。当我遇到这种情况时,通常会在我的实体/表名称末尾加上“Tbl”,以避免潜在的冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接