Hibernate:エンティティークラスに基づくdbテーブルの自動作成/更新


101

次のエンティティークラスがあります(Groovy内):

import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType

@Entity
public class ServerNode {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id

  String firstName
  String lastName

}

そして私のpersistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="NewPersistenceUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/>
            <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.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hbm2ddl.auto" value="create"/>
        </properties>
        <class>net.interaxia.icarus.data.models.ServerNode</class>
    </persistence-unit>
</persistence>

そしてスクリプト:

import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence
import net.interaxia.icarus.data.models.ServerNode

def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit")
def manager = factory.createEntityManager()

manager.getTransaction().begin()

manager.persist new ServerNode(firstName: "Test", lastName: "Server")

manager.getTransaction().commit()

データベースIcarusは存在しますが、現在テーブルはありません。Hibernateがエンティティクラスに基づいてテーブルを自動的に作成または更新するようにしたいと考えています。どうすればこれを達成できますか?

回答:


104

hibernateフロントを外すことが違いを生むかどうかはわかりません。

参照は、それがあるべき示唆しますhibernate.hbm2ddl.auto

の値はcreate、sessionFactoryの作成時にテーブルを作成し、そのまま残します。

の値はcreate-dropテーブルを作成し、sessionFactoryを閉じるときにテーブルを削除します。

おそらく、javax.persistence.Tableアノテーションを明示的に設定する必要がありますか?

お役に立てれば。


12
これは、hbm2dll.autoの先頭に欠落していた「hibernate」でした。ありがとう!
Jason Miesionczek 2008年

その行を削除しただけで、テーブルは削除されません。お役に立てれば!
Meinkraft、2015年

1
テーブルが存在しない場合にのみ、休止状態にしてテーブルを作成するにはどうすればよいですか?
アマンナガルコティ2017

81

あなたはpersistence.xmlのこの行を

<property name="hbm2ddl.auto" value="create"/>

に:

<property name="hibernate.hbm2ddl.auto" value="update"/>

これは、アプリを実行するたびにモデルに加えた変更を追跡するためにスキーマを維持することになっています。

これをJavaRanchから取得しました


10

構成の設定方法によっては、プロパティタグの長い形式と短い形式でも違いが生じることがあります。

たとえば、次のような場合:

<property name="hibernate.hbm2ddl.auto" value="create"/>

それを次のように変更してみてください:

<property name="hibernate.hbm2ddl.auto">create</property>

6

私の場合、テーブルは以下にリストされている最後のプロパティなしでは初めて作成されませんでした:

<properties>
    <property name="hibernate.archive.autodetection" value="class"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.format_sql" value="true"/>
    <property name="hbm2ddl.auto" value="create-drop"/>
    <!-- without below table was not created -->
    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
</properties>

WildflyのインメモリH2データベースを使用


2

非常に重要な詳細が1つあります。Hibernateがテーブルを生成するのを妨げる可能性があります(すでにを設定している場合hibernate.hbm2ddl.auto)。@Tableアノテーションも必要です!

@Entity
@Table(name = "test_entity")
    public class TestEntity {
}

それは私の場合、少なくとも3回は役に立ちました-それでも覚えられません;)

PS。hibernateのドキュメントを読んでください。ほとんどの場合、アプリを停止するとテーブルが削除さhibernate.hbm2ddl.autoれるためcreate-drop、に設定したくない場合があります。


0

applicationContext.xmlファイル:

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <!-- This makes /META-INF/persistence.xml is no longer necessary -->
      <property name="packagesToScan" value="com.howtodoinjava.demo.model" />
      <!-- JpaVendorAdapter implementation for Hibernate EntityManager.
           Exposes Hibernate's persistence provider and EntityManager extension interface -->
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
         </props>
      </property>
   </bean>

0

@thorinkorの回答をサポートするために、エンティティの@Table(name = "table_name")アノテーションだけでなく、エンティティクラスのすべての子変数にも@Column(name = "col_name")アノテーションを付ける必要があります。これにより、外出先でのテーブルのシームレスな更新が可能になります。

Javaクラスベースのhibernate構成を探している人のために、ルールはJavaベースの構成(NewHibernateUtil)にも適用されます。それが他の誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.