首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA/Hibernate无法创建名为Order的实体

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

Stack Overflow用户
提问于 2010-08-30 19:13:43
回答 2查看 6.5K关注 0票数 10

我使用Hibernate/JPA,并有一个名为Order的@Entity对象,使用Hibernate的动态表格生成指向MySQL数据库,即在运行时为实体生成表。当Hibernate创建表时,它为除Order实体之外的所有实体创建表。如果我将Order实体重命名为其他名称,例如StoreOrder,则创建store_order表没有问题。

此外,如果我这样做了,但随后注释StoreOrder对象以使用@Table (name="order")指定它应该创建的表名为'order‘,则不再创建该表。

我意识到order是一个保留字,但这是它不能创建表的原因吗?这看起来很奇怪,因为Hibernate docs使用了一个名为Order的实体的示例。

这看起来不像是MySQL问题,因为我可以直接在数据库上手动创建一个名为order的表。

下面是相关的Order实体对象定义...

代码语言:javascript
复制
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity {
... rest of POJO def...
}

...and相应的Persistence.xml

代码语言:javascript
复制
<?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 :)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-31 01:23:28

ORDER字是一个保留关键字,您必须对其进行转义。

在JPA 1.0中,没有标准化的方法,Hibernate特定的解决方案是使用反引号:

代码语言:javascript
复制
@Entity
@Table(name="`Order`")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity {
... rest of POJO def...
}

JPA 2.0对此进行了标准化,语法如下:

代码语言:javascript
复制
@Entity
@Table(name="\"Order\"")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Order extends PersistentEntity {
... rest of POJO def...
}

参考文献

数据库Objects的

  • JPA2.0规范
    • 2.13命名

票数 21
EN

Stack Overflow用户

发布于 2010-08-30 19:40:59

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3599803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档