2010-11-29 11 views
20

No puedo hacer que la creación automática de tablas funcione en primavera cuando se usa hibernate/jpa.¿Cómo hacer que la creación automática de tablas funcione en spring/hibernate/jpa?

Éstos son mis archivos de configuración:

<?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="naveroTest"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>xxx</class> 
     ... 


     <properties> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> 
    <property name="hibernate.connection.url" value="jdbc:hsqldb:file:/tmp/naveroTestDB"/> 
      <property name="hibernate.connection.username" value="sa"/> 
      <property name="hibernate.connection.password" value=""/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

context.xml

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

    <!-- For auto creation of tables --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
     <property name="url" value="jdbc:hsqldb:file:/tmp/naveroTestDB" /> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
     </property> 
     <property name="jpaVendorAdapter"> 
     <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="generateDdl" value="true" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" /> 
     <property name="showSql" value="true" /> 
     </bean> 
     </property> 
    </bean> 

    <bean id="PictureBean" class="de.navero.server.bl.PictureBean"> 
     <property name="entityManagerFactory"><ref local="entityManagerFactory" /></property> 
    </bean> 

    </beans> 

Alguna idea de lo que puede estar mal? Gracias por cualquier ayuda :).

Respuesta

6

Puede intentar cambiar la propiedad generateDdl a falso en HibernateJpaVendorAdapter en su archivo de configuración de primavera.

parece estar en conflicto con la propiedad de hibernación hibernate.hbm2ddl.auto

Ver https://jira.springframework.org/browse/SPR-6836 para obtener más información.

12

pruebe lo siguiente:


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

<?xml version="1.0" encoding="UTF-8"?> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
... 
      <prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

Esto funciona para mí.

+1

es 'todavía persistence.xml' requerido? –

+0

persistence.xml nunca es necesario para las versiones recientes de Hibernate (y Spring para el caso). Todo se puede hacer usando anotaciones. – kervin

+0

@kervin: hasta hoy he pensado lo mismo, pero al menos hasta la versión 4.3.7 de hibernación necesitará un 'persistence.xml' si está usando transacciones JTA, y tiene que establecer' JTA' para el atributo 'transaction-type' (@Jin Kwon: por lo que no lo necesita). De lo contrario, obtendrá excepciones extrañas y engañosas con respecto a las transacciones. Me llevó un día descubrirlo. Ver http://stackoverflow.com/questions/14456622/jtasessioncontext-being-used-with-jdbctransactionfactory-auto-flush-will-not-op –

1

tristemente ambas soluciones no funcionaron para mí :(. "Hibernate.hbm2ddl.auto = actualización" también sería aceptable, ya que debe crear las tablas si no están presentes.

Parece que todas las configuraciones de propiedades de persistence.xml se reconocen como nombre de usuario y el proveedor de bases de datos están configurados correctamente. Lamentablemente, las tablas no se crean al inicio, lo que hace que mi testcase falle ya que la instrucción SELECT arroja un error ...

Como usted Puedo ver que he configurado la URL de conexión para utilizar una base de datos local, lo que me permite revisar el registro de la base de datos después de la prueba. Pero el archivo de registro sigue vacío después de la prueba, incluso si no se escribe ningún error: (.

2

En mi hibernación-default.cfg.xml he usado

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

y funcionó a la perfección, por lo que el archivo de configuración es el siguiente

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="dialect"> 
     org.hibernate.dialect.MySQLDialect 
    </property> 
    <property name="current_session_context_class">thread</property> 
    <!-- When an HQL statement declares a true/false, replace with the standard Y/N --> 
    <property name="hibernate.query.substitutions">true 'Y', false 'N'</property> 
    <!-- A useful property do debugging queries. Besure sure it is false or commented out when going PROD --> 
    <!--  <property name="hibernate.show_sql">true</property> --> 
    <!-- Format the printed out SQL generated by Hibernate --> 
    <property name="hibernate.format_sql">false</property> 
    <!-- If enabled, Hibernate will collect statistics useful for performance tuning - JMX --> 
    <property name="hibernate.generate_statistics">false</property> 

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

    <mapping class=.... 
7

que tenía exactamente el mismo problema ...

Comentando propiedad

<!--property name="generateDdl" value="true"--> in the JpaAdapter, 

pero configuración

<property name="hibernate.hbm2ddl.auto" value="create"/> in persistence.xml 

funcionó para mí. Estoy usando hsqldb.

Noté en los registros que el modo estaba listo para actualizar sin importar lo que configuré en persistence.xml.

El valor en persistence.xml realmente se recogió pero nunca se aplicó. Estoy usando Spring 3.0.6 y Hibernate 4

-3

En mi caso, las tablas no se han creado porque los objetos con anotada @Table donde no anotados como @Entity

-2

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

Yo estaba usando spring 2.5, hibernate3, y HSQL base de datos.

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.

+0

En la pregunta (HSQLDB) se utiliza para ejecutar las pruebas, en este caso, supongo que cambiar la base de datos a (H2) no es un problema. –

0

Esto funcionó para mí

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
     <property name="url" value="jdbc:hsqldb:mem://productDb" /> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 
<property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="generateDdl" value="true" /> 
       <property name="showSql" value="true" /> 
      </bean> 
     </property> 

Si cambio de valor en falso como éste <property name="generateDdl" value="false" /> entonces consigo SqlExceptionHelper:144 - Table not found in statement

Cuestiones relacionadas