0

仕事では、Eclipse、Jboss、およびHibernate JPAを使用しています。小規模なプライベート プロジェクトでは、Netbeans、GlassFish、および Hibernate JPA を使用するのが好きです。

問題: hibernate にテーブルを自動的に生成させたいのですが、それができません。

私がしたこと:

  • 最初に、Netbeans、Glassfish、およびローカルの MySQL-DB をインストールしました。
  • Glassfish 用の JDBC 接続を作成しました。

    URL:jdbc:mysql://localhost:3306/myDatabase?zeroDateTimeBehavior=convertToNull

    名前:myDatabaseJDBC

    運転者:com.mysql.jdbc.Driver

接続は問題ないようです。「テスト」すると、正常な接続に解決されました。

  • 今、私はこのようにpersistance.xmlを作成しました:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 
        xmlns="http://java.sun.com/xml/ns/persistence" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
          http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="primary" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>myDatabaseJDBC</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
    

  • 次に、必要な依存関係をプロジェクトに追加し(mavenを使用)、休止状態のプラグインをGlassfishに追加しました

機能: テーブルを作成すると、Netbeans で Select できNew -> Other -> Persistance -> Entity Class from Databaseます。接続にテーブルが表示されます。1 つ選択して [OK] をクリックすると、エンティティが取得されます。

ただし、通常は逆の方法で作業し、作成されたエンティティから休止状態にテーブルを生成させます...誰でも機能しません。(プロジェクトのビルド時に、Hibernate が呼び出されていないようにさえ見えます)

構成手順を見逃していませんか?

アップデート: - - - - - - -

休止状態が何らかの方法で「アクティブ」であるかどうかをテストしたかったのです。そこで、単純なエンティティであるコントローラーを作成し、1 つのボタンでアプリケーションをデプロイしました。

public void doSth() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("primary");
    EntityManager em = emf.createEntityManager();

    CEntity c = new CEntity();
    c.setName("Test");

    em.persist(c);
}

まず、例外を受け取りました:

Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:376)

Overhere: hibernate、mysql、glassfish v3、および JTA データソース追加するソリューションを見つけました

// For GlassFish:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup

persistance.xml に。例外はなくなりましたが、別のものを受け取りました: Unknown Entity: CEntity.

私は、休止状態が私のエンティティを見つけることができないことを理解しました。(はい、javax.persistance.Entity休止状態の名前空間のものではなく、使用しました)。ただし、エンティティを手動で「追加」persistance.xmlすると問題が解決し、自動テーブル作成も呼び出されます。

ただし、現在は正しい構成を探しているため、すべてのエンティティをpersistance.xmlに追加する必要はありません。

設定<exclude-unlisted-classes>false</exclude-unlisted-classes>しましたが、休止状態はそれを無視しているようです...

4

1 に答える 1

1

重要なのは、次を追加することでした。

<property name="hibernate.archive.autodetection" value="class"/>

persistence.xml の properties-collection に。結局:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="primary">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>myDatabaseJDBC</jta-data-source>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
            <property name="hibernate.archive.autodetection" value="class"/>
        </properties>
    </persistence-unit>
</persistence>
于 2013-05-17T17:01:37.727 に答える