Bonjour à tous !
Je m'initie actuellement à Hibernate et tente de faire fonctionner mon projet test de la façon suivante :
- j'utilise H2 (mode in memory)
- J'ai une entity décorée d'annotations JPA
- j'ai essayé avec @Entity, @Table pour définir le nom de la table, un @Id et un @Column sur chaque champ)
- j'ai essayé ensuite avec juste @Entity et @Id pour laisser hibernate gérer les noms par COC (convention over configuration)
- le tout est paramétré dans le context Spring (hibernate template, annotation session factory, datasource, conf hibernate et annotated classes)
A l'exécution je bute invariablement sur une exception :
Code:
nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
org.h2.jdbc.JdbcSQLException: Table PERSON not found;
Ma config spring est la suivante :
Code:
<context:component-scan base-package="org.phoenix.sandbox.hssb.dao"></context:component-scan>
<!-- DAO -->
<bean id="abstractDAO" abstract="true"
class="org.phoenix.sandbox.hssb.dao.AbstractDAO">
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="personDAO" class="org.phoenix.sandbox.hssb.dao.impl.PersonDAOImpl"
parent="abstractDAO" />
<!-- Templates -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager" />
</bean>
<tx:annotation-driven />
<!-- Datasource beans -->
<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" />
<property name="username" value="sa" />
<property name="password" value="" />
<!-- number of max active connections -->
<property name="maxActive" value="10" />
<property name="maxWait" value="1000" />
<property name="defaultAutoCommit" value="true" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hbm2ddl.auto">create</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>org.phoenix.sandbox.hssb.model.Person</value>
</list>
</property>
</bean>
Je me demande si hibernate est capable de créer automatiquement la base en mémoire et la table PERSONS ou si je dois créer un script SQL à fournir soit à SQL soit à une init de H2.
Autre détail, je n'ai pas de classe HibernateUtil pour créer mon annotation session factory, puisqu'elle est configurée par Spring, et fournie à l'hibernate template par injection.
Quelqu'un aurait-il une idée, pourrait me dire si j'oublie quelque chose, ou si je me trompe quelque part?
Merci d'avance !
Frédéric