JPA / Hibernate не может создать объект с именем Order - PullRequest
10 голосов
/ 30 августа 2010

Я использую Hibernate / JPA и у меня есть объект @Entity с именем Order, указывающий на базу данных MySQL с использованием динамической генерации таблиц Hibernate, то есть генерирует таблицы во время выполнения для объектов.Когда Hibernate создает таблицы, он создает таблицы для всех моих сущностей, кроме сущности Order.Если я переименую сущность Order во что-то другое, например StoreOrder, таблица store_order будет создана без проблем.

Кроме того, если я сделаю это, но затем аннотирую объект StoreOrder, чтобы указать, что создаваемая им таблица называется 'order' с использованием @Table (name = "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?

Cheers

1020 * J :) 1021 *

Ответы [ 2 ]

17 голосов
/ 30 августа 2010

Слово 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 голос
/ 30 августа 2010

Возможно, потому что 'Order' является ключевым словом в SQL.Когда я сталкиваюсь с этим, я обычно просто помещаю 'Tbl' в конце имен моих сущностей / таблиц, чтобы избежать потенциального столкновения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...