2012-01-23 10 views
7

नहीं बदलता है मैं स्प्रिंग + जेपीए + हाइबरनेट का उपयोग कर एक वेबसाइट विकसित कर रहा हूं। दृढ़ता विन्यास (जेपीए + हाइबरनेट) में मैं HibernateJpaVendorAdapter की जेनरेट डीडीएल विशेषता को सत्य में सेट कर रहा हूं और वास्तव में नई संस्थाएं डीबी में नई तालिका को सही ढंग से बनाती हैं।HibernateJpaVendorAdapter's GenerDdl तालिका

एक बार तालिका बनाई गई है, हालांकि, अगर मैं इकाई में एक विशेषता जोड़ता हूं, तो मैं तालिका को बदलने और कॉलम जोड़ने के लिए HibernateJpaVendorAdapter की अपेक्षा कर रहा हूं। यह नहीं हो रहा है और यह अजीब बात है क्योंकि Java AbstractJpaVendorAdapter के setGenerateDdl विधि प्रलेखन में यह है: "EntityManagerFactory प्रारंभ करने के बाद डीडीएल उत्पन्न करना है या नहीं, सभी प्रासंगिक तालिकाओं को अद्यतन करना।"

जेपीए + हाइबरनेट विन्यास:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${db.driverClassName}" /> 
    <property name="url" value="${db.url}" /> 
    <property name="username" value="${db.username}" /> 
    <property name="password" value="${db.password}" /> 
</bean> 

<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
    <property name="showSql" value="${db.showSql}" /> 
    <property name="generateDdl" value="${db.generateDdl}" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter" ref="jpaAdapter" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 
     xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
     version="1.0"> 

    <persistence-unit name="m8tsPU" /> 
</persistence> 

Am मैं कर कुछ गलत?

उत्तर

16

आप एक उपयुक्त हाइबरनेट विशेष संपत्ति सीधे सेट करके DDL पीढ़ी पर एक अधिक कुशल नियंत्रण प्राप्त कर सकते हैं:, वैकल्पिक रूप से

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    ... 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      ... 
     </props> 
    </property> 
</bean> 

आप update के बजाय create-drop उपयोग कर सकते हैं, के बाद से update कुछ में समस्याएँ हो सकती हैं मामलों। नोट, हालांकि, स्वचालित डीडीएल अपडेट उत्पादन के उपयोग के लिए नहीं है।

+0

कोई बात नहीं, मैंने उस बिंदु के लिए एक और सवाल पूछा। – satoshi

6

वैकल्पिक रूप से, आप भी jpaPropertyMap का उपयोग कर एक ही गुण व्यक्त कर सकते हैं:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    ... 
     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="hibernate.hbm2ddl.auto" value="update"/> 
       ... 
      </map> 
     </property> 
</bean> 
0

हो सकता है कि देर से, लेकिन आज मैं एक ही समस्या थी जब मैं एक विरासत अनुप्रयोग के लिए कुछ परीक्षण लिख रहा था।

समस्या तब होती है जब आप generateDdl संपत्ति का उपयोग करते हैं लेकिन HSQL भी उपयोग किया जाता है।

इसे हल करने के लिए मैं H2 को HSQL से डेटाबेस बदल गया है और org.springframework.jdbc.datasource.DriverManagerDataSource से org.apache.commons.dbcp.BasicDataSource को डेटा स्रोत।

वसंत-context.xml लगता है:

<?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:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="org.h2.Driver"/> 
     <property name="url" value="jdbc:h2:mem:test"/> 
     <property name="username" value="sa"/> 
     <property name="password" value=""/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <tx:annotation-driven/> 
... 
</beans> 

persistence.xml लगता है:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 

    <persistence-unit name="TestPU" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

मुझे आशा है कि यह मदद करता है।