ไฮเบอร์เนต: สร้าง / อัปเดตตารางฐานข้อมูลโดยอัตโนมัติตามคลาสเอนทิตี


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มีอยู่ แต่ขณะนี้ไม่มีตาราง ฉันต้องการให้ไฮเบอร์เนตสร้างและ / หรืออัปเดตตารางโดยอัตโนมัติตามคลาสเอนทิตี ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?

คำตอบ:


104

ฉันไม่รู้ว่าการออกhibernateจากด้านหน้าทำให้เกิดความแตกต่างหรือไม่

อ้างอิงแสดงให้เห็นว่ามันควรจะเป็นhibernate.hbm2ddl.auto

ค่าของcreateจะสร้างตารางของคุณในการสร้าง sessionFactory และปล่อยให้มันเหมือนเดิม

ค่าของcreate-dropจะสร้างตารางของคุณแล้ววางลงเมื่อคุณปิด sessionFactory

บางทีคุณควรตั้งค่าjavax.persistence.Tableคำอธิบายประกอบอย่างชัดเจน?

หวังว่านี่จะช่วยได้


12
มันเป็น 'hibernate' ที่หายไปในตอนต้นของ hbm2dll.auto ขอบคุณ!
Jason Miesionczek

ฉันเพิ่งลบบรรทัดนั้นออกไปและมันจะไม่หล่นลงโต๊ะ หวังว่านี่จะช่วยได้!
Meinkraft

1
ฉันจะไฮเบอร์เนตเพื่อสร้างตารางเฉพาะในกรณีที่ไม่มีอยู่ได้อย่างไร
Aman Nagarkoti

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>

ใช้ฐานข้อมูล H2 ในหน่วยความจำของ Wildfly


2

มีรายละเอียดที่สำคัญมากอย่างหนึ่งที่สามารถหยุดการจำศีลของคุณจากการสร้างตารางได้ (สมมติว่าคุณได้ตั้งค่าไว้แล้วhibernate.hbm2ddl.auto) คุณจะต้องมี@Tableคำอธิบายประกอบ!

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

มันช่วยในกรณีของฉันไปแล้วอย่างน้อย 3 ครั้ง - ยังจำไม่ได้;)

ปล. อ่านเอกสารไฮเบอร์เนต - ในกรณีส่วนใหญ่คุณอาจไม่ต้องการตั้งค่า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 กฎจะใช้ในการกำหนดค่าที่ใช้ java ด้วย (NewHibernateUtil) หวังว่ามันจะช่วยคนอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.