Bonjour à tous,

Je tente de me mettre à Hibernate/Spring, mais je coince sur certains problèmes à mon avis simple à régler, mais un peu nébuleux pour moi, et ai certaines questions probablement triviales.

Tout d'abord, quel dialecte est-il préférable d'utiliser avec MySQL? Quels sont les avantages et inconvéniants? Pour ma part, j'ai opté pour

Code : Sélectionner tout - Visualiser dans une fenêtre à part
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Alors, j'ai construit une classe User que voici avec son mapping :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class User implements Cloneable,java.io.Serializable {
    private static final long serialVersionUID = 1L;
    protected java.lang.String name;
    protected java.lang.Long id;
 
    public java.lang.String getName() {
        return name;
    }
 
    public void setName(java.lang.String name) {
        this.name = name;
    }
 
    public java.lang.Long getId() {
        return id;
    }
 
    public void setId(java.lang.Long id) {
        this.id = id;
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false">
<class name="myPackage.User" table="t_User">
      <id name="id" column="c_id" type="java.lang.Long">
         <generator class="increment"/>
      </id>
      <property name="name" type="java.lang.String" column="c_name"/>
   </class>
</hibernate-mapping>
J'ai aussi une question au sujet du generateur d'identifiant. Bien qu'ayant lu la doc d'hibernate, je ne sais vraiment pas pour quel generateur opter. A priori j'aurais préféré "sequence", mais visiblement ça ne fonctionne pas sous MySQL. Par ailleurs, "increment" que j'utilise ici m'embête parce que ma DB va probablement être attaquée par plusieurs applis dans l'avenir... Je ne vois pas à quoi correspond "identity" par rapport à "assigned", et j'avoue que j'aurais bien profité du "auto_increment" de MySQL, mais je ne sais pas à quoi le faire correspondre, et le sql que me génère Hibernate n'a pas l'air de le prendre en compte... :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
create table t_User (c_id bigint not null, c_name varchar(255), primary key (c_id)) type=InnoDB;
Ensuite, j'ai ajouté la classe DAO :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public class UserDAOImpl extends org.springframework.orm.hibernate3.support.HibernateDaoSupport implements UserDAO {
 
    public User newUser(String name){        
        User user = new User();
        user.setName(name);
        getHibernateTemplate().save(user);
        return user;
    }
 
}
Je vous passe les fichiers de config Spring (je les ajouterais plus loin si mon soucis vient de là), et donc voici enfin, la classe de test que j'ai créée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UserTest extends org.springframework.test.AbstractTransactionalSpringContextTests {
 
    protected UserDAO userDAO; // Spring injection
 
    public UserTest() {
        super();
        setPopulateProtectedVariables(true);
    }
 
    @Override
    protected String[] getConfigLocations() {
        return new String[] { "file:WEB-INF/applicationContext.xml" };
    }
 
    public void testUser(){
        User user = userDAO.newUser("JUnit");
        assertNotNull(user);
    }
 
}
C'est alors en exécutant les test que j'ai l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL [file:WEB-INF/SpringBeans/sessionFactory.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: could not instantiate id generator
Caused by: org.hibernate.MappingException: could not instantiate id generator
    at org.hibernate.id.IdentifierGeneratorFactory.create(IdentifierGeneratorFactory.java:98)
    at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:152)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:192)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:807)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:740)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:131)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1062)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1029)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:420)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
    at org.springframework.test.AbstractSingleSpringContextTests.createApplicationContext(AbstractSingleSpringContextTests.java:199)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContextLocations(AbstractSingleSpringContextTests.java:179)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContext(AbstractSingleSpringContextTests.java:158)
    at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:105)
    at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:87)
    at junit.framework.TestCase.runBare(TestCase.java:128)
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:120)
    at junit.framework.TestSuite.runTest(TestSuite.java:230)
    at junit.framework.TestSuite.run(TestSuite.java:225)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.hibernate.MappingException: Dialect does not support sequences
    at org.hibernate.dialect.Dialect.getSequenceNextValString(Dialect.java:596)
    at org.hibernate.id.SequenceGenerator.configure(SequenceGenerator.java:65)
    at org.hibernate.id.IdentifierGeneratorFactory.create(IdentifierGeneratorFactory.java:94)
    ... 34 more
A noter la ligne en gras dans les traces : je suis en generator increment, et pourtant il me parle de sequence...

Quelqu'un voit-il ce qui cloche?

Merci d'avance pour votre aide et vos suggestions à mes autres questions!