IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[HB/MySQL] Could not instantiate id generator


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut [HB/MySQL] Could not instantiate id generator
    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!

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Pour mySql, utilise "identity" ou "auto"

    J'oubliais, dans la table, la colonne devrait être créée avec "auto_increment"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    "auto"? Ca existe? Ca n'a pas l'air d'être reconnu, et je ne l'ai pas trouvé dans la Doc...
    http://www.hibernate.org/hib_docs/v3...n-id-generator

    Ils disent pour identity :

    Utilisation de la colonne identity de DB2, MySQL, MS SQL Server, Sybase et HypersonicSQL. L'identifiant renvoyé est de type long, short ou int.
    Cela veut-il dire que je dois faire une colonne identity???


    Sinon, ok pour fixer ma table "auto_increment" à la main, mais que dois-je faire pour que le Hibernate Schema Export la crée lui-même?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ca veut dire que tu dois créer ta table comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table t_User(c_id bigint not null auto_increment, c_name varchar(255), primary key (c_id)) type=InnoDB
    Ensuite, ton mapping hibernate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <class name="myPackage.User" table="t_User">
       <id name="id" column="c_id" type="java.lang.Long">
          <generator class="identity"/>
       </id>
       <property name="name" type="java.lang.String" column="c_name"/>
    </class>
    Maintenant, j'ai un doute sur le type "Long"... De mémoire, il y avait un problème, mais le plus simple, c'est que tu fasses le test.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    non non pas de souci avec le type long normalement.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    OK, super, en utilisant le dialect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <hibernate-dialect>org.hibernate.dialect.MySQLDialect</hibernate-dialect>
    avec le générateur "identity", le Schema Export d'Hibernate me crée bien correctement l'auto-increment dans le script sql.

    Mon test fonctionne maintenant, et j'ai bien gardé le type Long.

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/01/2008, 11h34
  2. [PHPMailer] Could not instantiate mail function
    Par Sayrus dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 07/09/2007, 11h14
  3. Réponses: 2
    Dernier message: 23/05/2007, 11h40
  4. Réponses: 1
    Dernier message: 13/02/2007, 09h07
  5. Réponses: 1
    Dernier message: 22/11/2006, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo