2012-01-23 10 views
7

Estoy desarrollando un sitio web usando Spring + JPA + Hibernate. En la configuración de persistencia (JPA + Hibernate) estoy configurando el atributo generateDdl de HibernateJpaVendorAdapter como verdadero y, de hecho, nuevas entidades crean correctamente la nueva tabla en el DB.generateDdl de HibernateJpaVendorAdapter no altera las tablas

Una vez que se ha creado la tabla, si agrego un atributo a la entidad, espero que HibernateJpaVendorAdapter modifique la tabla y agregue la columna también. Esto no está sucediendo y es extraño porque en la documentación del método setGenerateDdl de Java AbstractJpaVendorAdapter hay: "Establezca si se genera DDL después de que se inicializó EntityManagerFactory, creando/actualizando todas las tablas relevantes". configuración

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

estoy haciendo algo mal?

Respuesta

16

Usted puede obtener un control más preciso sobre la generación DDL mediante el establecimiento de una propiedad de hibernación-específico apropiado directamente:

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

Como alternativa, puede utilizar create-drop en lugar de update, ya update puede causar problemas en algunos casos. Sin embargo, tenga en cuenta que la actualización automática de DDL no está destinada para uso en producción.

+0

No importa, hice otra pregunta para ese punto. – satoshi

6

Como alternativa, también se puede expresar utilizando las mismas propiedades 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

Tal vez a finales, pero hoy he tenido el mismo problema cuando estaba escribiendo algunas pruebas para una aplicación de legado.

El problema se produce no solo cuando utiliza la propiedad generateDdl, sino que también se utiliza HSQL.

Para resolverlo Me cambió la base de datos de HSQL a H2 y la fuente de datos de org.springframework.jdbc.datasource.DriverManagerDataSource a org.apache.commons.dbcp.BasicDataSource.

El resorte context.xml parece:

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

El persistence.xml parece:

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

espero que ayude.

Cuestiones relacionadas