Hazırda Bekletme: Varlık sınıflarına göre db tablolarını otomatik olarak oluşturma / güncelleme


101

Aşağıdaki varlık sınıfına sahibim (Groovy'de):

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

}

ve benim persistence.xml'm:

<?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>

ve senaryo:

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 veritabanı mevcut, ancak şu anda tablo içermiyor. Hibernate'in tabloları varlık sınıflarına göre otomatik olarak oluşturmasını ve / veya güncellemesini istiyorum. Bunu nasıl başarabilirim?

Yanıtlar:


104

Cepheden hibernateayrılmak bir fark yaratır mı bilmiyorum .

Referans olması gerektiğini göstermektedirhibernate.hbm2ddl.auto

Bir değeri, createtablolarınızı sessionFactory oluştururken oluşturacak ve onları olduğu gibi bırakacaktır.

Bir değeri create-droptablolarınızı oluşturur ve ardından sessionFactory'yi kapattığınızda onları bırakır.

Belki de javax.persistence.Tableek açıklamayı açıkça belirlemelisiniz?

Bu yardımcı olur umarım.


12
Hbm2dll.auto dosyasının başlangıcındaki eksik 'hazırda bekletme' idi. Teşekkürler!
Jason Miesionczek

Bu satırı yeni kaldırdım ve masayı düşürmeyecek. Bu yardımcı olur umarım!
Meinkraft

1
Yalnızca yoksa tablolar oluşturmak için nasıl hazırda bekletme yapabilirim?
Aman Nagarkoti

81

Kalıcılık.xml dosyanızdaki bu satırı şuradan değiştirmeyi deneyebilirsiniz:

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

to:

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

Bunun, uygulamayı her çalıştırdığınızda Modelde yaptığınız değişiklikleri takip etmesi için şemayı sürdürmesi gerekir.

Bunu JavaRanch'tan aldım


10

Bazen yapılandırmanın nasıl ayarlandığına bağlı olarak, özellik etiketinin uzun biçimi ve kısa biçimi de fark yaratabilir.

örneğin, beğenirseniz:

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

şu şekilde değiştirmeyi deneyin:

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

6

Benim durumumda, aşağıda listelenen son özellik olmadan tablo ilk kez oluşturulmadı:

<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'ın bellek içi H2 veritabanını kullandı


2

Çok önemli bir ayrıntı var, muhtemelen hazırda bekletme durumunuzun tablo oluşturmasını durdurabilir (zaten ayarlamış olduğunuzu varsayarak hibernate.hbm2ddl.auto). @TableEk açıklamaya da ihtiyacınız olacak !

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

Benim durumumda zaten en az 3 kez yardımcı oldu - hala hatırlayamıyorum;)

PS. Hazırda bekletme belgelerini okuyun - çoğu durumda , uygulamayı durdurduktan sonra Tablolarınızı sileceği hibernate.hbm2ddl.autoiçin muhtemelen ayarlamak istemeyeceksiniz create-drop.


0

ApplicationContext.xml dosyasında:

<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'un cevabını desteklemek için, cevabımı varlık için yalnızca @Table (name = "table_name") ek açıklamasını değil, aynı zamanda varlık sınıfının her alt değişkenini @Column (name = "col_name") ile açıklamalıyım. Bu, hareket halindeyken masanın sorunsuz bir şekilde güncellenmesine neden olur.

Java sınıfı tabanlı bir hazırda bekletme yapılandırması arayanlar için kural, java tabanlı yapılandırmalar için de geçerlidir (NewHibernateUtil). Umarım başkasına yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.