次のエンティティークラスがあります(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がエンティティクラスに基づいてテーブルを自動的に作成または更新するようにしたいと思います。どうすればこれを達成できますか?
hibernate
を先頭から外しておくことで違いが生じるかどうかはわかりません。
参照 は、hibernate.hbm2ddl.auto
であることを示唆しています
値がcreate
の場合、sessionFactoryの作成時にテーブルが作成され、そのまま残ります。
create-drop
の値はテーブルを作成し、sessionFactoryを閉じるときにそれらを削除します。
おそらく javax.persistence.Table
アノテーションを明示的に設定する必要がありますか?
お役に立てれば。
Persistence.xmlのこの行を次から変更してみてください。
<property name="hbm2ddl.auto" value="create"/>
に:
<property name="hibernate.hbm2ddl.auto" value="update"/>
これは、アプリを実行するたびにモデルに加えた変更に従うようにスキーマを維持することになっています。
JavaRanch からこれを手に入れました
構成の設定方法によっては、プロパティタグの長い形式と短い形式でも違いが生じる場合があります。
例えばあなたがそれを持っている場合:
<property name="hibernate.hbm2ddl.auto" value="create"/>
変更してみてください:
<property name="hibernate.hbm2ddl.auto">create</property>
私の場合、以下にリストされている最後のプロパティがなければ、テーブルは初めて作成されませんでした。
<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データベースを使用
非常に重要な詳細が1つあります。これは、休止状態がテーブルを生成しないようにする可能性があります(既にhibernate.hbm2ddl.auto
を設定している場合)。 @Table
アノテーションも必要です!
@Entity
@Table(name = "test_entity")
public class TestEntity {
}
私の場合、少なくとも3回はすでに助けています-まだ思い出せません;)
PS。 hibernate docsをお読みください-ほとんどの場合、おそらくhibernate.hbm2ddl.auto
をcreate-drop
に設定する必要はありません。アプリを停止するとテーブルが削除されるためです。
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>