簡體   English   中英

JPA / Hibernate無法創建名為Order的Entity

[英]JPA/Hibernate can't create Entity called Order

我正在使用Hibernate / JPA並且有一個名為Order的@Entity對象,使用Hibernate的動態表生成指向MySQL數據庫,即在運行時為實體生成表。 當Hibernate創建表時,它會為除Order實體之外的所有實體創建表。 如果我將Order實體重命名為其他東西,例如StoreOrder,則創建store_order表沒有問題。

此外,如果我這樣做但隨后注釋StoreOrder對象以指定它應創建的表使用@Table(name =“order”)稱為“order”,則不再創建表。

我意識到訂單是一個保留字,但這是它無法創建表的原因嗎? 考慮到Hibernate docs使用一個名為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>

有關為什么沒有創建這個Order實體但是如果我將它重命名為StoreOrder而創建的想法?

干杯,

J :)

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

參考

可能是因為'Order'是SQL中的關鍵字。 當我遇到這個時,我通常只在實體/表名的末尾加上'Tbl'以避免潛在的沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM