web-dev-qa-db-fra.com

Comment faire pour que la création automatique de table fonctionne en spring/hibernate/jpa?

Je ne parviens pas à utiliser la création automatique de table au printemps avec hibernate/jpa.

Voici mes fichiers de configuration:

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

Des idées sur ce qui peut ne pas être correct? Merci pour toute aide :).

20
Ben

essayez ce qui suit:


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

Cela fonctionne pour moi.

12
ytoh

J'ai eu exactement le même problème ... 

Commentant la propriété 

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

mais mise 

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

a travaillé pour moi. J'utilise hsqldb. 

J'ai remarqué dans les journaux que le mode était configuré pour être mis à jour, peu importe ce que j'avais défini.

La valeur dans persistence.xml a été effectivement collectée mais jamais appliquée . J'utilise Spring 3.0.6 et Hibernate 4

7
Shahed

Pouvez-vous essayer de changer la propriété generateDdl en false sur HibernateJpaVendorAdapter dans votre fichier de configuration printanier.

Semble entrer en conflit avec la propriété hibernate hibernate.hbm2ddl.auto

Voir https://jira.springframework.org/browse/SPR-6836 pour plus d'informations.

6
ddewaele

Dans mon hibernate-default.cfg.xml j'ai utilisé 

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

et cela a fonctionné parfaitement, donc le fichier de configuration était comme suit

<?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=....
2
Theresa Forster

malheureusement, les deux solutions ne fonctionnent pas pour moi :(. "hibernate.hbm2ddl.auto = update" serait également correct, car il devrait créer les tables si elles ne sont pas présentes.

Il semble que tous les paramètres de propriété de persistence.xml soient reconnus en tant que nom d'utilisateur et fournisseur de base de données correctement définis. Malheureusement, les tables ne sont pas créées au démarrage, ce qui provoque l'échec de mon test case car l'instruction SELECT génère une erreur ...

Comme vous pouvez le constater, l’URL de connexion a été configurée pour utiliser une base de données de fichiers locale, ce qui me permet de consulter le journal de la base de données après l’exécution du test. Mais le fichier journal est toujours vide après l'exécution du test, aucune erreur n'y est écrite :(.

1
Ben

Cela a fonctionné pour moi

<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 je change la valeur en false comme ceci<property name="generateDdl" value="false" />, alors je reçois SqlExceptionHelper:144 - Table not found in statement

0
rajeev pani..