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 :

[Mapping] Hibernate et MySQL


Sujet :

Hibernate Java

  1. #1
    Membre actif Avatar de dvicente72
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 213
    Points : 226
    Points
    226
    Par défaut [Mapping] Hibernate et MySQL
    Salut à tous,

    voilà j'utilise Hibernate 3.2.0GA et MySQL 5.1.17.

    Mon souci est que j'ai fait un mapping comme suit :

    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
     
    <class name="AbstractReportBean" abstract="true">
    		<id name="id" type="long" column="report_id">
    			<generator class="native" />
    		</id>
    		<many-to-one name="mavenProject" column="MAVENPROJECT_ID"
    			class="DashBoardMavenProject" />
    		<property name="dateGeneration" column="dateGeneration"
    			type="timestamp" />
    	</class>
    	<!-- org.codehaus.mojo.dashboard.report.plugin.beans.CheckstyleReportBean root -->
    	<!-- table="CheckstyleReportBean"  -->
    	<union-subclass name="CheckstyleReportBean"
    		table="CheckstyleReportBean" extends="AbstractReportBean">
    		<property name="nbClasses" column="nbClasses" type="int" />
    		<property name="nbInfos" column="nbInfos" type="int" />
    		<property name="nbErrors" column="nbErrors" type="int" />
    		<property name="nbWarnings" column="nbWarnings" type="int" />
    		<property name="nbTotal" column="nbTotal" type="int" />
    		<query name="getCheckstyleByDashBoardMavenProjectID">
    			<![CDATA[
    		select c from CheckstyleReportBean c,DashBoardMavenProject m where c.mavenProject = m and m.id = :id
    		]]>
    		</query>
    		<query name="getCheckstyleByPeriod">
    			<![CDATA[
    		select c from CheckstyleReportBean c,DashBoardMavenProject m where c.mavenProject = m and m.id = :id and c.dateGeneration >= :startdate and c.dateGeneration <= :enddate 
    		]]>
    		</query>
    	</union-subclass>
    et quand j'execute mon code ( ça devrait créer les tables automatiquement)

    j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: org.codehaus.mojo.dashboard.report.plugin.beans.AbstractReportBean
    Mon probleme est que je ne sais pas le résoudre sachant que le même mapping fonctionne sous Oracle 9i et Apache Derby.

    A priori, MySQL utilise un IdentityGenerator qui ne serait pas supporté avec des classes Union dans Hibernate.

    Comment contourner ça sans modifier l'ensemble du mapping ?

  2. #2
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 666
    Points : 412
    Points
    412
    Par défaut
    parceque mysql ne fait pas d'auto increment
    il faut gerer par une consultation de hsql pour voir si la liste des resultat est null , si oui mettre l'id à 1 sinon mettre en ayant recuperer max(id)
    max(id) + 1

  3. #3
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 666
    Points : 412
    Points
    412
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try {
    			Query q=HibernateSessionFactory.getSession().createSQLQuery("select max(idcandidat) from Candidat");
    			;candidat.setIdcandidat(( (Integer) q.list().get(0))+Integer.valueOf(1));
    		} catch (Exception e) {candidat.setIdcandidat(Integer.valueOf(1));}
    voila pour moi ca marche bonne chance

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je ne suis pas certain que ce soit une bonne idée.
    Tu risques d'avoir des doublons d'id.

    De plus MySql gère très bien l'auto-increment, il n'y pas de soucis de ce coté là.

  5. #5
    Membre actif Avatar de dvicente72
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 213
    Points : 226
    Points
    226
    Par défaut
    est-ce que je n'aurai pas interêt à utiliser un generator UUID pour que cela soit compatible avec tout type de base ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je n'ai pas de problème avec un generator native avec MySql.

  7. #7
    Membre actif Avatar de dvicente72
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 213
    Points : 226
    Points
    226
    Par défaut
    le probleme ne vient pas du generator native en tant que tel, c'est que avec native, Hibernate determine un generator Identity et ça ça ne fonctionne pas avec un mapping Union-subclass, il y a directement un exception levée dans ce cas là , il suffit de regarder le code de la classe : org.hibernate.persister.entity.UnionSubclassEntityPersister

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Oups, j'avais zappé le problème initial.

    Je ne sais pas répondre à ton problème dans ce cas.

  9. #9
    Membre actif Avatar de dvicente72
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 213
    Points : 226
    Points
    226
    Par défaut
    j'ai résolu mon probleme, il suffit juste d'utilise un generator Increment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <generator class="increment" />
    et là ça fonctionne sur n'importe quelle base.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je ne crois pas que le type increment soit recommandé en mode multi-utilisateurs à cause du problème de doublons.

    A vérifier dans la documentation.

  11. #11
    Membre actif Avatar de dvicente72
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 213
    Points : 226
    Points
    226
    Par défaut
    je suis d'accord avec toi mais mon mapping Hibernate est fait pour le plugin maven "Dashboard".

    Dans ce cas, son utilisation se fait en général à partir d'un Continuum centralisé avec en plus le lancement des builds dans une queue.

    Ou alors il me faudrait 2 mappings en fonction du type de base ?

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    En fait ce que j'ai dit n'est pas exact.
    D'après la doc Hibernate:
    increment
    Génère des identifiants de type long, short ou int qui ne sont uniques que si aucun autre processus n'insère de données dans la même table. Ne pas utiliser en environnement clusterisé
    Donc si un seul processus insère des données (ce qui semble être ton cas) ça ne devrait pas poser de problèmes.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/12/2009, 22h49
  2. Mapping Hibernate : <composite-id>
    Par tome tome dans le forum Hibernate
    Réponses: 6
    Dernier message: 10/11/2009, 14h18
  3. fichier Mapping hibernate avec MySQL
    Par benamira dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/01/2009, 05h11
  4. mapping Hibernate Mysql
    Par nihadelg dans le forum Hibernate
    Réponses: 1
    Dernier message: 11/05/2008, 16h56
  5. mapping hibernate
    Par enimiste dans le forum Hibernate
    Réponses: 11
    Dernier message: 16/05/2006, 11h20

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