Hibernate: Secara otomatis membuat / memperbarui tabel db berdasarkan kelas entitas

101

Saya memiliki kelas entitas berikut (di 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

}

dan persistence.xml saya:

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

dan naskahnya:

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()

database Icarus ada, tetapi saat ini tidak memiliki tabel. Saya ingin Hibernate secara otomatis membuat dan / atau memperbarui tabel berdasarkan kelas entitas. Bagaimana saya mencapai ini?

Jason Miesionczek
sumber

Jawaban:

104

Saya tidak tahu apakah meninggalkan hibernatebagian depan membuat perbedaan.

The referensi menyarankan itu harushibernate.hbm2ddl.auto

Nilai dari createakan membuat tabel Anda pada pembuatan sessionFactory, dan membiarkannya tetap utuh.

Nilai dari create-dropakan membuat tabel Anda, dan kemudian menjatuhkannya saat Anda menutup sessionFactory.

Mungkin Anda harus menyetel javax.persistence.Tableanotasi secara eksplisit?

Semoga ini membantu.

toolkit
sumber
12
Itu adalah 'hibernate' yang hilang di awal hbm2dll.auto. Terima kasih!
Jason Miesionczek
Saya baru saja menghapus baris itu dan tidak akan menjatuhkan tabel. Semoga ini membantu!
Meinkraft
1
bagaimana cara membuat hibernasi untuk membuat tabel hanya jika tidak ada?
Aman Nagarkoti
81

Anda dapat mencoba mengubah baris ini di persistence.xml Anda dari

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

untuk:

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

Ini dimaksudkan untuk mempertahankan skema agar mengikuti setiap perubahan yang Anda buat pada Model setiap kali Anda menjalankan aplikasi.

Dapatkan ini dari JavaRanch

billjamesdev
sumber
10

Kadang-kadang bergantung pada bagaimana konfigurasi diatur, bentuk panjang dan pendek dari tag properti juga dapat membuat perbedaan.

misalnya jika Anda memilikinya seperti:

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

coba ubah menjadi:

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

Dalam kasus saya, tabel tidak dibuat untuk pertama kalinya tanpa properti terakhir yang tercantum di bawah ini:

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

menggunakan database H2 dalam memori Wildfly

DevDio
sumber
2

Ada satu detail yang sangat penting, yang mungkin dapat menghentikan hibernasi Anda dari membuat tabel (dengan asumsi Anda sudah menyetelnya hibernate.hbm2ddl.auto). Anda juga akan membutuhkan @Tableanotasi!

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

Ini telah membantu dalam kasus saya setidaknya 3 kali - masih tidak dapat mengingatnya;)

PS. Baca dokumen hibernasi - dalam banyak kasus Anda mungkin tidak ingin menyetel hibernate.hbm2ddl.autoke create-drop, karena ini menghapus tabel Anda setelah menghentikan aplikasi.

thorinkor
sumber
0

Dalam file 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>
Yusuf Aksun
sumber
0

Untuk mendukung jawaban @ thorinkor, saya akan memperluas jawaban saya untuk menggunakan tidak hanya anotasi @Table (name = "table_name") untuk entitas, tetapi juga setiap variabel anak dari kelas entitas harus dianotasi dengan @Column (name = "col_name"). Ini menghasilkan pembaruan yang mulus ke tabel saat dalam perjalanan.

Bagi mereka yang mencari konfigurasi hibernate berbasis kelas Java, aturan ini juga berlaku dalam konfigurasi berbasis java (NewHibernateUtil). Semoga bisa membantu orang lain.

AbsoluteDev
sumber