-->
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.  [ 4 posts ] 
Author Message
 Post subject: Débutant hibernate cles composites
PostPosted: Sat Sep 17, 2005 8:55 am 
Newbie

Joined: Fri Sep 16, 2005 1:44 pm
Posts: 10
Location: France (Paris)
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version:2.1.7c

Mapping documents:

Code between sessionFactory.openSession() and session.close():

Full stack trace of any exception that occurs:

Name and version of the database you are using:postgres 8.0

The generated SQL (show_sql=true):

Debug level Hibernate log excerpt:


Bonjour a tous


J'espère que mon pb va interrésser quelques personnes car
je desespère un peu depuis deux jours ...

j'ai un shéma de table comme suit:

groupe_utilisateur(pk gru_id)=gru_obj(pk gru_id,obj_id)=objet(pk obj_id)
..................................................||
..................................................||
................................................droit(pk droit_id)

je voudrais charger la liste des objets d'un groupe et modifier
son droit.
groupe_utilisateur. est composé de ses propriétes + un set
(cf + bas )

GruObj.hbm.xml a une classe composite de 2 element
objet, groupe_utilisateur
+ 3 many-to-one objet, groupe_utilisateur, droit
(cf + bas)

la mise a jour de groupe_utilisateur s'effectue très bien
mais rien ne se passe sur gru_obj ?

le + curieux c'est que dès que unsaved-value="any"
j'obtiens des 'insert into ( gru_id,obj_id) values ( 1, 2)
(en erreur duplicate pk)
hibernate oublie droit_id ? mais pourquoi ?
je n'ai rien avec unsaved-value="none" ?





CREATE TABLE droit
(
droit_id serial NOT NULL,
droit_lib varchar(60) NOT NULL,
CONSTRAINT pk_droit PRIMARY KEY (droit_id)
)

droit n'a que 2 valeurs 'R' et 'RW'



CREATE TABLE objet
(
obj_id serial NOT NULL,
obj_lib varchar(60) NOT NULL,
CONSTRAINT pk_objet PRIMARY KEY (obj_id)
)


CREATE TABLE groupe_utilisateur
(
gru_id serial NOT NULL,
gru_lib varchar(60) NOT NULL,
CONSTRAINT pk_groupe_utilisateur PRIMARY KEY (gru_id)
)


Nous sommes dans un cas simple a priori (le cas a été simplifié un peu)
GroupeUtilisateur.hbm.xml
est tel que :

********************************************

<class name="app.hb.GroupeUtilisateur" table="groupe_utilisateur">

<id
name="gru_id"
type="java.lang.Integer"
column="gru_id"
unsaved-value="null"
>

<generator class="native" >
<param name="sequence">groupe_utilisateur_gru_id_seq</param>
</generator>
</id>

<property
name="gru_lib"
type="java.lang.String"
column="gru_lib"
not-null="true"
length="60"
/>


<!-- bi-directional one-to-many groupe_utilisateur to gru_obj -->
<set name="gru_obj_gru_ids" inverse="true" cascade="save-update" lazy="false" >
<key>
<column name="gru_id" not-null="true" />
</key>
<one-to-many class="app.hb.GruObj" />
</set>
</class>



********************************************

GruObj.hbm.xml
<hibernate-mapping>

<class name="app.hb.GruObj" table="gru_obj">

<composite-id name="comp_id" class="app.hb.GruObjPK" >

<key-property
name="obj_id"
column="obj_id"
type="java.lang.Integer"
length="4"
/>

<key-property
name="gru_id"
column="gru_id"
type="java.lang.Integer"
length="4"
/>
</composite-id>

<!--bi-directional many-to-one gru_obj to objet -->
<many-to-one
name="objet_obj_id"
class="app.hb.Objet"
not-null="true"
update="false"
insert="false"
>
<column name="obj_id" />
</many-to-one>

<!--bi-directional many-to-one gru_obj to groupe_utilisateur -->
<many-to-one
name="groupe_utilisateur_gru_id"
class="app.hb.GroupeUtilisateur"
not-null="true"
update="false"
insert="false"
>
<column name="gru_id" />
</many-to-one>

<!--bi-directional many-to-one gru_obj to droit -->
<many-to-one
name="droit_droit_id"
class="app.hb.Droit"
not-null="true"
update="false"
insert="false"
>
<column name="droit_id" />
</many-to-one>

</class>

</hibernate-mapping>

********************************************
public class GruObjPK implements Serializable
{
// Declaration des variables classiques
private Integer obj_id;
private Integer gru_id;


/********************************************
* Constructeur de classe avec initialisation.
********************************************/
public GruObjPK(
Integer obj_id
,Integer gru_id
)
{
this.obj_id = obj_id;
this.gru_id = gru_id;
}

plus les get et set

********************************************

public class GruObj implements Serializable
{
// Pas de Declaration des variables classiques
// Declaration des variables classiques
private app.hb.Objet objet_obj_id;
private app.hb.GroupeUtilisateur groupe_utilisateur_gru_id;
private app.hb.Droit droit_droit_id;
private app.hb.GruObjPK comp_id;


/********************************************
* Constructeur de classe avec initialisation.
********************************************/
public GruObj(
app.hb.GruObjPK comp_id
,app.hb.Objet objet_obj_id
,app.hb.GroupeUtilisateur groupe_utilisateur_gru_id
,app.hb.Droit droit_droit_id
)
{
this.comp_id = comp_id;
this.objet_obj_id = objet_obj_id;
this.groupe_utilisateur_gru_id = groupe_utilisateur_gru_id;
this.droit_droit_id = droit_droit_id;
}


plus les get et set


********************************************

public class GroupeUtilisateur implements Serializable
{
// Declaration des variables classiques
private Integer gru_id;
private String gru_lib;

private Set gru_obj_gru_ids ;

private Set gru_util_gru_ids ;


/********************************************
* Constructeur de classe avec initialisation.
********************************************/
public GroupeUtilisateur(
Integer gru_id
,String gru_lib
,Set gru_obj_gru_ids
,Set gru_util_gru_ids
)
{
this.gru_id = gru_id;
this.gru_lib = gru_lib;
this.gru_obj_gru_ids = gru_obj_gru_ids ;
this.gru_util_gru_ids = gru_util_gru_ids ;
}

+ les get et les set


Si vous avez une idée Merci



[/b]


Top
 Profile  
 
 Post subject:
PostPosted: Sun Sep 18, 2005 11:38 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Tu fournis certes quelques informations, mais je dois dire qu'il m'est encore bien trop difficile de reconstituer ton test.

Pour que je puisse t'aider, il me faudrait:
1) une séquence de test bien définie (ce qui est désigné par Code between sessionFactory.openSession() and session.close())
2) Mappings et classes (plutôt trop que pas assez - il est plus facile d'éliminer que de "boucher" les trous) utilisés

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 19, 2005 3:33 am 
Newbie

Joined: Fri Sep 16, 2005 1:44 pm
Posts: 10
Location: France (Paris)
Tu as raison

tout dabord un petite modif sur le
GroupeUtilisateur.hbm.xml cascade="all-delete-orphan"
sinon je n'ai pas les delete
ce script est la compilation de 4 classes, l'affichage et les actions
s'effectuent des moments différents d'ou les multiples

hsession = HibernateUtil.currentSession( );


voici un script de test :

hsession = HibernateUtil.currentSession( );
tx = hsession.beginTransaction();
Query q = hsession.createQuery(" from GroupeUtilisateur ");
List list = q.list();
tx.commit();
HibernateUtil.closeSession();

GroupeUtilisateur currentgroupeutilisateur = (GroupeUtilisateur) list.get(0) ;

Vector vremove = new Vector();
Iterator iter = currentgroupeutilisateur.getgru_obj_gru_ids().iterator();
while ( iter.hasNext() )
{

GruObj iremoveGruObj = (GruObj) iter.next();
if (iremoveGruObj.getComp_id().getobj_id().intValue() > 40)
{
vremove.add(iremoveGruObj);
}
}

for(int i=0 ; i < vremove.size(); i++ )
currentgroupeutilisateur.getgru_obj_gru_ids().remove((GruObj)vremove.elementAt(i));

//sauvegarde
hsession = HibernateUtil.currentSession( );
tx = hsession.beginTransaction();
hsession.update(currentgroupeutilisateur);

tx.commit();
hsession.close();
HibernateUtil.closeSession();

// jusque la tout va bien j'obtiens des joyeux :
//Hibernate: delete from gru_obj where obj_id=? and gru_id=?
//Hibernate: delete from gru_obj where obj_id=? and gru_id=?
// dans le log



//***********************************
Droit inewDroit = new Droit(new Integer(2), new String("R"));
Objet inewObjet = new Objet( new Integer(2), new String("menu")
, new String(""), new Boolean(false)
, new Boolean(false), new Integer(100)
, new String("")) ;

GruObj inewGruObj = new GruObj(new GruObjPK(new Integer(50),new Integer(1))
, inewObjet
, currentgroupeutilisateur
, inewDroit
);

currentgroupeutilisateur.getgru_obj_gru_ids().add(inewGruObj);

hsession = HibernateUtil.currentSession( );
tx = hsession.beginTransaction();
hsession.update(currentgroupeutilisateur);


tx.commit();
hsession.close();
HibernateUtil.closeSession();


// et patatras
// insert into gru_obj (obj_id, gru_id) values (?, ?)
// il m'a oublié le droit_id qui est not null


Bon j'ai aussi essayé en ajoutant droit_id dans la cles composite
et la cela marche a defaut je ferai comme cela
mais ce n'est pas tout a fait ce que je voulais faire


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 19, 2005 3:40 am 
Newbie

Joined: Fri Sep 16, 2005 1:44 pm
Posts: 10
Location: France (Paris)
Dans tous les cas on ne peut pas générer d'update

J'oubliais Merci

Matta


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 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.