-->
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.  [ 10 posts ] 
Author Message
 Post subject: Probleme de lecture d'une collection à une autre??????
PostPosted: Tue Sep 13, 2005 1:36 pm 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
J'ai 4 classes (Request, Test, Result, file) dont les 3 premières possèdent une collection de l'une vers l'autre soit Request vers Test, Test vers Result et Result vers File. Je peux insérer les informations sans problème dans la base de donnée.

Mon problème relève du fait que je ne peux pas lire les informations passé la première table soit Request. Je n'obtient aucune erreur mes ma sql pourrait être représenté comme suit: * from Request where Request_Id = x;

Alors que je veux ceci : * from Request joint Test joint Result joint File......

Quel erreur de mapping je commet pour empêcher hibernate de lire adéquatement la requête???????

Si je ne suis pas suffisamment claire, svp me le dire, merci


Hibernate version:
hivernate 2.1.6

Mapping documents:

Il y a 4 mapping documents:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping >

<class name=" Request"
table="SAMPLE">

<id name="id"
type="java.lang.Long"
column="SAMPLE_NUMBER"
unsaved-value="0">
<generator class="assigned" />
</id>

<set name="Test" inverse="true" cascade="all-delete-orphan" lazy="true">
<key column="SAMPLE_NUMBER" />
<one-to-many class="Test"/>
</set>

<property name="loginDate"
type="timestamp"
column="LOGIN_DATE"
update="false"/>
</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class name="Test"
table="TEST">


<id name="id"
type="java.lang.Long"
column="TEST_NUMBER"
unsaved-value="0">
<generator class="assigned"/>
</id>

<timestamp name="dateStarted"
column="DATE_STARTED"
unsaved-value="null"/>



<many-to-one name="request"
column="SAMPLE_NUMBER"
class=" Request"
not-null="true"/>

<set name="results" inverse="true" cascade="all-delete-orphan" lazy="true">
<key column="TEST_NUMBER" />
<one-to-many class="Result"/>
</set>

</class>
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping
default-cascade="save-update">

<class name="Result" table="RESULT" >
<id name="id"
type="java.lang.Long"
column="RESULT_NUMBER"
unsaved-value="none">
<generator class="assigned" />
</id>

<timestamp name="dateEntered"
column="ENTERED_ON"
unsaved-value="null"/>

<set name="Files" inverse="true" lazy="true">
<key column="RESULT_NUMBER" />
<one-to-many class=".Result" />
</set>

<many-to-one name="test"
column="TEST_NUMBER"
class="Test"
not-null="true"/>

</class>

</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping
<class name="File "
table="FILES">

<id name="id"
column= "FILE_NAME"
type="java.lang.String"
length="10">
<generator class="assigned"/>
</id>
<timestamp name="dateChanged"
column="CHANGED_ON"
unsaved-value="null"/>

<many-to-one name="result"
column="RESULT_NUMBER"
class=" Result"
not-null="true"/>

</class>

</hibernate-mapping>


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

Full stack trace of any exception that occurs:

Name and version of the database you are using:
Oracle 9.x
The generated SQL (show_sql=true):

Debug level Hibernate log excerpt:


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 1:52 pm 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Juste une petite question de compréhension:
que se passe-t-il si tu essaies de lire les tests associés à une Request (par example)?
Si j'ai bien compris, tu reçois un Set vide - est-ce le cas?

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 2:17 pm 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Dans les faits, tu ne peux pas lire les tests sans passer par le request. Et effectivement les set sont vides lors d'une lecture et je n'arrive pas à savoir pourquoi. J'ai d'autres classes avec ayant une collection (structure beaucoup plus simple ) et ça fonctionne, est-ce le fait que j'ai 4 classes qui sont, si on peut dire, relié entre elle????


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 1:33 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
J'ai écris un simple test qui insère une Request et un Test liés l'un à l'autre dans la BD puis lit la Request et vérifie que le Test est bien là.

Ce test fonctionne impec dans mon environnement. Pour pouvoir t'aider davantage, je vais donc avoir besoin de plus d'informations:
1) Quelle version d'Hibernate utilises-tu?
2) Peux-tu poster un test illustrant concrêtement ton problème?

D'autre part je te conseillerais de commencer par des tests plus simples de tes relations (comme je l'ai fait avec seulement Request et Test) afin d'essayer de cerner le problème toi-même.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 7:35 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Version Hibernate: 2.1.6

Malheureusement je ne peux pas poster un test concret. Toutefois à l'aide de JUnit, j'ai testé ma hql et à part de l'objet premier, tous les autres objets mappés sont null.

Voici la hql:

<query name = "Request.search">
<![CDATA[from Request request
where request.Id like :string
order by request.Id
]]>

</query>

Dans une sql, on retrouverait des jointures. Ici hibernate selon les mappings insèrent ou non les jointures. Dans mon cas, hibernate n'insère pas les jointures et je ne sais pas pourquoi si mes mappings sont ok. Aurais-tu une idée qui pourrait me servir à trouver mon problème, pourquoi hibernate ne met pas les jointures????

Merci


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 8:35 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Finalement je crois avoir trouvé le problème. Lorsque la hql s'exécute dans un premier temp la session est ouverte mais lorsque vient le temp de faire la jointure, la session est fermée.

Voici la methode Hibernate Begin and Close transaction:

public List search(String string) throws DbException {
string= "%" + string.toUpperCase() + "%";
try {
HibernateUtil.beginTransaction();
Query query= HibernateUtil.getSession().getNamedQuery("Request.search");
query.setString("string", string);
return query.list();
} catch (HibernateException ex) {
System.err.println(className + SEARCH + ex.getMessage()); } finally {
HibernateUtil.commitTransaction();
//HibernateUtil.closeSession();
}
}

Si tu remarques j'ai mis le HibernateUtil.closeSession(); en commentaire.
Qu'elle est la meilleure pratique d'où l'on doit mettre le Begin and Close transaction, est-ce dans l'initiation de l'objet? dans la méthode comme je l'ai fait??

Merci de ta réponse ton aide m'a grandement aidé.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 8:37 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
dfini wrote:
Toutefois à l'aide de JUnit, j'ai testé ma hql et à part de l'objet premier, tous les autres objets mappés sont null.

Pourrais-tu poster ton JUnit.

Pour info: j'ai testé avec 3.0.5 - mais comme ce sont des fonctions de base, je ne m'attends pas à avoir de différence.

Je vais essayer de tester avec 2.1.6 un peu plus tard.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 8:47 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Comme tu peux voir la methode est très simple. Toutefois en testant la fonction par cette méthode voici l'erreur obtenu:

ERROR LazyInitializationException: Failed to lazily initialize a collection - no session or session was closed
net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no session or session was closed


Méthode utilisé pour tester.
public void testSearch() {
try {
Request aRequest= new Request();
//search for string and print results
for (Iterator iter= aRequest.search("xx").iterator(); iter.hasNext();) {
aRequest= (Request) iter.next();
System.out.println(aRequest.getId());
System.out.println(aRequest.getTest().iterator().hasNext());

}
} catch (DbException ex) {
System.out.println("Test: " + ex);
}
}

Ma question est: Dans l'objet qui DAO, d'où doit-on placer le Begin and Close transaction, dans la méthode search où lors de l'initialisation de l'objet et lors de la fermeture de l'objet??????

Merci


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 11:38 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
dfini wrote:
Ma question est: Dans l'objet qui DAO, d'où doit-on placer le Begin and Close transaction, dans la méthode search où lors de l'initialisation de l'objet et lors de la fermeture de l'objet??????

Le problème n'est pas tant la transaction - transactions sont bien sûr aussi très importantes, mais pas encore dans ton cas. Le problème est pour l'instant la durée de vie de la session hibernate et le fait que tes relations sont lues en mode lazy.

Une règle simple pour les tests avec JUnit serait d'ouvrir une session au début du test et de la fermer à la fin.

Dans une application véritable les choses sont évidemment plus compliquées et je ne me sens pas capables d'expliquer les problèmes en quelques mots...

Je crois qu'un bon livre sur le sujet est indispensable si tu dois construire une application un peu plus complexe - peut-être Hibernate in action serait-il un bon début sur Hibernate en général

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 11:50 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Je te remercie beaucoup et oui nous avons le livre Hibernate in Action que l'on utilise souvent. Je crois que la solution du problème car le problème est plus général que concentré sur une méthode DAO serait l'utilisation d'un filtre qui nous permettrait de contrôler le begin and close session.

Si jamais tu as un exemple tres simple d'un dao qui appelle un filtre, j'apprécierais que tu puisses le poster.

Merci encore une fois.


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