हाइबरनेट: इकाई वर्गों के आधार पर db टेबल को स्वचालित रूप से बनाना / अपडेट करना


101

मेरी निम्नलिखित इकाई वर्ग है (ग्रूवी में):

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

}

और मेरी दृढ़ता। 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()

डेटाबेस इकारस मौजूद है, लेकिन वर्तमान में कोई तालिका नहीं है। मैं हाइबरनेट को इकाई वर्गों के आधार पर तालिकाओं को स्वचालित रूप से बनाने और / या अपडेट करना चाहूंगा। मैं इसे कैसे पूरा करूंगा?

जवाबों:


104

मुझे नहीं पता hibernateकि सामने से निकलने से फर्क पड़ता है।

संदर्भ चलता है कि यह होना चाहिएhibernate.hbm2ddl.auto

createसत्र-निर्माण पर आपकी तालिकाएँ मान का निर्माण करेंगी, और उन्हें अक्षुण्ण बनाए रखेंगी।

एक मान create-dropआपके टेबल बनाएगा, और सत्र सत्र बंद करने के बाद उन्हें छोड़ देगा।

शायद आपको javax.persistence.Tableएनोटेशन को स्पष्ट रूप से सेट करना चाहिए ?

उम्मीद है की यह मदद करेगा।


12
यह hbm2dll.auto की शुरुआत में लापता 'हाइबरनेट' था। धन्यवाद!
जेसन Miesionczek

मैंने अभी उस पंक्ति को हटा दिया है और यह तालिका को नहीं गिराएगा। उम्मीद है की यह मदद करेगा!
मेकक्राफ्ट

1
मैं टेबल बनाने के लिए हाइबरनेट कैसे बना सकता हूं यदि वे मौजूद नहीं हैं?
अमन नागरकोटी

81

आप अपनी दृढ़ता में इस लाइन को बदलने का प्रयास कर सकते हैं। 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 डेटाबेस का उपयोग किया


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

@ थोरिंकर के उत्तर के समर्थन में, मैं अपना उत्तर न केवल @Table (नाम = "table_name") इकाई के लिए एनोटेशन का उपयोग करने के लिए बढ़ाऊंगा, बल्कि इकाई वर्ग के प्रत्येक बच्चे चर को @ कॉलम (नाम = "col_name") के साथ एनोटेट किया जाना चाहिए। यह जाने पर तालिका में सीमलेस अपडेशन का परिणाम है।

जो लोग जावा वर्ग आधारित हाइबरनेट कॉन्फ़िगरेशन की तलाश कर रहे हैं, उनके लिए जावा आधारित कॉन्फ़िगरेशन (NewHibernateUtil) में भी नियम लागू होता है। आशा है कि यह किसी और की मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.