2010-11-30 4 views
0

Nous utilisons spring, hibernate et hsql pour conserver une entité utilisateur simple. Nous obtenons toujours l'erreur "table introuvable". Avez-vous une idée de ce que cela pourrait être? Il semble que la table n'est pas générée ou que la base de données hsql ne fonctionne pas du tout.Hibernate, Spring & HSQL: Table non trouvée Exception

Cordialement, G.

@Entity 
@Table (name="USER") 
public class User { 


@Id 
@GeneratedValue(strategy= GenerationType.AUTO) 
@Column(name="ID") 
private Long id; 

@Column(name="NAME", length = 100, nullable = false) 
private String name; 

public User(){} 

     //getters and setters ... 

par cette classe dao:

package de.hsrm.mediathek; 

import java.util.List; 

public class UserDao implements IUserDao{ 

    private HibernateTemplate hibernateTemplate; 

    public void setHibernateTemplate(final HibernateTemplate hibernateTemplate){ 
     this.hibernateTemplate = hibernateTemplate; 
    } 

    @Transactional 
    public void store(final User user){ 
     hibernateTemplate.saveOrUpdate(user); 
    } 

    @Transactional 
    public void delete(final Long userId){ 
     final User user = (User) hibernateTemplate.get(User.class, userId); 
     hibernateTemplate.delete(user); 
    } 

    @Transactional(readOnly = true) 
    public User findById(final Long userId){ 
     return (User) hibernateTemplate.get(User.class, userId); 
    } 

    @Transactional(readOnly = true) 
    public List<User> findAll(){ 
     return hibernateTemplate.find("from User"); 
    } 

} 

XML de configuration:

<?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-3.0.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 


<tx:annotation-driven/> 

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:hsqldb:mem:mediathekdb" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses"> 
    <list> 
    <value>de.hsrm.mediathek.User</value> 
    </list> 
    </property> 
    <property name="hibernateProperties"> 
    <props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
    <prop key="hibernate.hbm2dll.auto">create-drop</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.format_sql">true</prop> 
    <prop key="hibernate.connection.pool_size">10</prop> 
    <prop 
    key="hibernate.cache.provider_class"> 
    org.hibernate.cache.HashtableCacheProvider</prop> 
    </props> 
    </property> 

</bean> 

<bean id="hibernateTemplate" 
    class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="userDao" class="de.hsrm.mediathek.UserDao"> 
    <property name="hibernateTemplate" ref="hibernateTemplate" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<!-- Interceptor for hibernate calls to be able to create and close sessions 
<bean id="hibernateInterceptor" 
    class="org.springframework.orm.hibernate3.HibernateInterceptor"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 
--> 
</beans> 

erreur LOG:

Caused by: java.sql.SQLException: Table not found in statement [insert into User (ID, NAME) values (null, ?)] 
at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source) 
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:528) 
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:95) 
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:30) 
... 63 more 

Répondre

0

Je vous conseille d'essayer d'exécuter HSQLDB en mode serveur à l'aide:

java -classpath hsqldb.jar org.hsqldb.server.Server 

Vérifiez qu'il est en cours d'exécution en utilisant le gestionnaire de base de données:

java -classpath hsqldb.jar org.hsqldb.util.DatabaseManagerSwing 

Ensuite, modifiez votre URL Hibernate, il utilise le mode serveur HSQLDB:

<property name="url" value="jdbc:hsqldb:mediathekdb" /> 

J'ai eu du succès en utilisant cette méthode. Il est possible que create-drop ne fonctionne pas correctement lorsque vous utilisez une instance de mémoire uniquement.

7

Le problème est que la propriété "hbm2dll" est mal orthographiée. Il devrait être « hbm2ddl »:

Il est:

<prop key="hibernate.hbm2dll.auto">create-drop</prop> 

Il devrait être:

<prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
+2

+1 pour avoir des yeux de détective – darioo

3

Il est également préférable de garder un oeil sur les journaux pour toute autre erreur, comme je l'avais problème similaire et découvert que l'instruction create table échouait pour le DDL de HSQLDB généré par Hibernate et Hibernate l'avalait silencieusement

2011-06-09 10:48:30,722 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Wrong data type: ALERT_ID in statement [create table ACCOUNT_ALERT (ALERT_ID numeric generated by default as identity (start with 1)] 

Plus tard, quand je l'ai changé la

suivante
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="ALERT_ID") 
private BigInteger alertId; 

à

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
@Column(name="ALERT_ID") 
private BigInteger alertId; 

cela a fonctionné parfaitement.