2012-01-23 7 views
7

Sto sviluppando un sito Web utilizzando Spring + JPA + Hibernate. Nella configurazione di persistenza (JPA + Hibernate) sto impostando l'attributo generateDdl di HibernateJpaVendorAdapter su true e in effetti le nuove entità creano correttamente la nuova tabella nel DB.HibernateJpaVendorAdapter generaDdl non modifica le tabelle

Una volta creata la tabella, tuttavia, se aggiungo un attributo all'entità, mi aspetto che HibernateJpaVendorAdapter modifichi la tabella e aggiunga anche la colonna. Questo non sta accadendo ed è strano perché nella documentazione del metodo setGenerateDdl di Java AbstractJpaVendorAdapter c'è: "Impostare se generare DDL dopo che EntityManagerFactory è stato inizializzato, creando/aggiornando tutte le tabelle rilevanti." Configurazione

JPA + Hibernate:

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

sto facendo qualcosa di sbagliato?

risposta

16

È possibile ottenere un controllo più raffinato sui generazione DDL impostando una proprietà Hibernate-specifiche pertinenti direttamente:

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

In alternativa, è possibile utilizzare create-drop invece di update, dal momento che update può causare problemi in alcuni casi. Si noti, tuttavia, che l'aggiornamento DDL automatico non è destinato all'uso in produzione.

+0

Non importa, ho fatto un'altra domanda per quel punto. – satoshi

6

In alternativa, è anche possibile esprimere le stesse proprietà utilizzando 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

Forse alla fine, ma oggi ho avuto lo stesso problema quando stavo scrivendo alcuni test per un'applicazione legacy.

Il problema si verifica non solo quando si utilizza la proprietà generateDdl ma si utilizza anche HSQL.

Per risolvere il problema, ho modificato il database da HSQL a H2 e l'origine dati da org.springframework.jdbc.datasource.DriverManagerDataSource a org.apache.commons.dbcp.BasicDataSource.

La collezione primavera-context.xml assomiglia:

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

Il persistence.xml assomiglia:

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

spero che aiuta.

Problemi correlati