2010-12-22 21 views
32

http://www.vaannila.com/spring/spring-hibernate-integration-1.htmlहाइबरनेट डेटाबेस स्वचालित रूप से

में टेबल बना है इस ट्यूटोरियल पढ़ने पर, वे डीबी में तालिका बनाने के ऊपर कुछ भी उल्लेख नहीं किया है। एक बार जब मैं उन्हें निर्दिष्ट करता हूं तो हाइबरनेट इसे टेबल और फ़ील्ड बनाकर स्वचालित रूप से संभालता है।

यहां मेरी बीन्स कॉन्फ़िगरेशन है।

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"/> 
     <property name="username" value="monwwty"/> 
     <property name="password" value="www"/> 
    </bean> 

    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>uk.co.vinoth.spring.domain.User</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="myUserDAO" class="uk.co.vinoth.spring.dao.UserDAOImpl"> 
     <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 

    <bean name="/user/*.htm" class="uk.co.vinoth.spring.web.UserController" > 
     <property name="userDAO" ref="myUserDAO" /> 
    </bean> 

</beans> 

उत्तर

49

अपने hibernate.hbm2ddl.auto सेटिंग को परिभाषित किया जाना चाहिए कि डेटाबेस बनाई गई है (विकल्प हैं validate, create, update या create-drop)

+1

यह सेटिंग हाइबरनेट कॉन्फ़िगरेशन फ़ाइल में पाई जाती है। –

23

हाँ यह आपके कॉन्फ़िगरेशन में निम्न संपत्ति के कारण आपके मामले में है। परीक्षण के दौरान यह ठीक है लेकिन उत्पादन में आपको इसे अक्षम करने की आवश्यकता है।

<prop key="hibernate.hbm2ddl.auto">create</prop> 
+0

क्या आप विस्तार से बता सकते हैं कि उत्पादन के दौरान इसे अक्षम क्यों किया जा रहा है? –

+1

"अंतर्निर्मित हाइबरनेट कनेक्शन पूल उत्पादन के उपयोग के लिए किसी भी तरह से नहीं है। इसमें उत्पादन-तैयार कनेक्शन पूल पर कई सुविधाएं शामिल हैं।"http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/ch02.html –

5

हाँ, हाइबरनेट में hibernate.hbm2ddl.auto संपत्ति के माध्यम से विन्यस्त किया जा सकता hibernate.cfg.xml फ़ाइल आपके डीबी में स्वचालित रूप से टेबल बनाने के लिए फ़ाइल में है ताकि तालिका में पहले से मौजूद न हो।

यह विकास के दौरान आसान हो सकता है जहां एक नया, in-memory, डीबी का उपयोग किया जा सकता है और एप्लिकेशन के हर भाग या परीक्षण के दौरान एक नया बनाया जा सकता है।

5

मेरे लिए यह hibernate.hbm2ddl.auto पर भी update पर काम नहीं कर रहा था। यह पता चला कि जेनरेटेड सृजन एसक्यूएल अमान्य था, क्योंकि मेरे कॉलम नामों में से एक (user) एक SQL कीवर्ड था। यह धीरे-धीरे विफल रहा, और यह स्पष्ट नहीं था कि जब तक मैंने लॉग का निरीक्षण नहीं किया तब तक क्या चल रहा था।

-1

हाँ आप

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

ऐड निम्नलिखित संपत्ति अपने hibernate.cfg.xml फ़ाइल में

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

Btw, अपने इकाई कक्षा में उपयोग कर सकते हैं, तो आप अपने @Id तरह दायर परिभाषित करना होगा यह:

@Id 
@GeneratedValue(generator = "increment") 
@GenericGenerator(name = "increment", strategy = "increment") 
@Column(name = "id") 
private long id; 

यदि आप निम्न परिभाषा का उपयोग करते हैं, तो यह मी aybe काम नहीं:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id") 
private long id; 
0

हाइबरनेट एक तालिका बनाने के कर सकते हैं, अनुक्रम और टेबल आपकी ओर से कई-से-अनेक मानचित्रण के लिए इस्तेमाल किया हाइबरनेट लेकिन आप स्पष्ट रूप से setProperty ("hibernate.hbm2ddl.auto" को फोन करके यह कॉन्फिगर करना , कॉन्फ़िगरेशन ऑब्जेक्ट का "बनाएं")। डिफ़ॉल्ट रूप से, यह केवल डीबी के साथ स्कीमा को मान्य करता है और त्रुटि देता है अगर कुछ भी पहले से मौजूद नहीं है "ORA-00942: तालिका या दृश्य मौजूद नहीं है"।

यदि आप कॉन्फ़िगरेशन से ऊपर करते हैं तो निष्पादित क्रियाओं का क्रम होगा: - ए) सभी टेबल और अनुक्रम ड्रॉप करें और अगर वे पहले से मौजूद नहीं हैं तो कोई त्रुटि न दें। बी) सभी तालिका और अनुक्रम बनाएँ सी) बाधाओं के साथ तालिकाएं बदलें डी) इसमें डेटा डालें।

संबंधित मुद्दे