-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Utilisation d'une séquence pour un champ d'une clé composite
PostPosted: Tue Jun 30, 2009 10:36 am 
Newbie

Joined: Tue Jun 30, 2009 10:27 am
Posts: 2
Bonjour,

J'ai une entité dont la clé est composée de deux champs et je souhaiterais utiliser une séquence pour un des deux champs.
Comment configurer mon mapping hbm pour associer une séquence à un de mes champs de la clé composite (composite-id).

Voici mon code :
<class name="org.peyron.persistant.AutorisationVO" table="AUTO" select-before-update="true">
<composite-id name="id" class="org.peyron.persistant.AutorisationPK">
<key-property name="id" type="integer">
<column name="AUTO_ID" precision="8" scale="0"/>
</key-property>
<key-property name="ini" type="boolean">
<column name="AUTO_INI" precision="1" scale="0"/>
</key-property>
</composite-id>
...

Je souhaiterais que id soit basé sur une séquence.
Comment faire ?

Merci d'avance.


Top
 Profile  
 
 Post subject: Re: Utilisation d'une séquence pour un champ d'une clé composite
PostPosted: Wed Jul 01, 2009 7:03 am 
Newbie

Joined: Wed Jul 01, 2009 6:38 am
Posts: 11
Je l'ai fait mais pour une clé composée avec un seul champ, mais c'est pareil.

Il faut créer un generator spécifique en étendant
Code:
org.hibernate.id.SequenceGenerator
. Ensuite overrider la méthode
Code:
public Serializable generate(SessionImplementor session, Object mappedBean)
qui retourne un objet du type de ta clé composée.
Globalement la méthode :
  • instancie un objet du type de ta clé composée
  • appelle
    Code:
    Serializable idSer = super.generate(session, mappedBean);
    pour récupérer un nouvel id de la sequence
  • affecte cet id sur ton objet de clé

côté mapping hbm, cela donne un truc du style :
Code:
<composite-id name="id" class="ton objet de clé">
         <key-property name ="key" column="<nom physique de la colonne>" type="java.lang.Long"/>
         <generator class="ton generator customisé">
         <param name="sequence"><nom de la sequence></param>
      </generator>
      </composite-id>


Attention, suivant la version d'hibernate le tag composite-id ne suporte pas le tag generator. Il suffit de modifier la dtd (hibernate-mapping-3.0.dtd) et hibernate s'ensortira.(il vaut mieux en créer une nouvelle pour ton projet et changer la référence dans les mapping hibernate :
Code:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/ta dtd perso.dtd">
)
mettre
Code:
<!ELEMENT composite-id ( meta*, (key-property|key-many-to-one)+ , generator? )>

au lieu de
Code:
<!ELEMENT composite-id ( meta*, (key-property|key-many-to-one)+ )>


Ca fonctionne avec hibernate-3.2.5.ga


Top
 Profile  
 
 Post subject: Re: Utilisation d'une séquence pour un champ d'une clé composite
PostPosted: Wed Jul 01, 2009 7:09 am 
Newbie

Joined: Wed Jul 01, 2009 6:38 am
Posts: 11
Pour info, j'étais parti de ce post pour faire tout ça :
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2060


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.