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
Alors, j'ai construit une classe User que voici avec son mapping :
Code : Sélectionner tout - Visualiser dans une fenêtre à part hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
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; } }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
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>
Ensuite, j'ai ajouté la classe DAO :
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;
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 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; } }
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 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); } }
A noter la ligne en gras dans les traces : je suis en generator increment, et pourtant il me parle de sequence...
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
Quelqu'un voit-il ce qui cloche?
Merci d'avance pour votre aide et vos suggestions à mes autres questions!
Partager