-->
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.  [ 7 posts ] 
Author Message
 Post subject: Problem bei Query und Sub-Klassen
PostPosted: Wed Mar 04, 2009 7:34 am 
Newbie

Joined: Wed Mar 04, 2009 6:40 am
Posts: 4
Hallo zusammen,

ich habe ein sehr rätselhaftes Problem mit Sub-Klassen. Ich verwende die aktuelle Hibernate-Versionen jedoch mit aktueller Collection-Library (im Hibernate-Download ist ja ne veraltete Version).

Ich habe folgende Klassen:

Code:

class ForumThread {
...
    @OneToMany(fetch=FetchType.EAGER,mappedBy="thread")
  private List<ThreadPage> pages = Collections.synchronizedList(new Vector<ThreadPage>());
...
}

class  ThreadPage {
...
  private ForumThread thread;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "threadPage")
  @Sort(type = SortType.NATURAL)
  public SortedSet<ForumPost> posts;
...
}

class ForumPost {
...
  @ManyToOne
  private ThreadPage threadPage;
...
}



Ich möchte jetzt alle ForumThread-Objekte mit bestimmten IDs laden.

Code:
Query q = session.createQuery("from ForumThread where id in (1,2,3,4)");
List result = q.list();


Anhand der EAGER-Definitionen werden jetzt alle entsprechenden ThreadPages sowie die Posts dazugeladen. Das Problem ist, dass aus mir nicht erklärlichen Gründen bei mehreren ForumThreads ein ForumPost fehlt.


Ich habe zur Protokollierung die SQL-Angaben ausgeben lassen:
Code:
log4j.logger.org.hibernate.SQL=ALL
log4j.logger.org.hibernate.type=ALL


Da ist zu sehen, dass der SQL-Befehl erstmal alle ForumPosts korrekt liefert und dass Hibernate diese auch korrekt abarbeitet. Lediglich im Ergbnis, also wenn ich durch result durchlaufe, fehlen die Posts. Ich habe den Durchlauf gleich nach dem Laden durchgeführt, um Seiteneffekte zu verhindern.

Ich hab in der Bugliste keinen entsprechenden Eintrag gefunden. Hat jemand eine Idee, wie ich das Problem lösen bzw. umgehen kann?

Gruß

Wurstbrot


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 04, 2009 9:27 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
(Wo sind da Subklassen?)

Hast du auch nicht vergessen bei jedem Post und jeder Page vorm Speichern den Thread bzw. die Page zu setzen?

Collections.synchronizedList wird dir übrigens nicht viel bringen, da die Collection beim Laden durch eine Hibernate Collection ersetzt wird.

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 04, 2009 9:43 am 
Newbie

Joined: Wed Mar 04, 2009 6:40 am
Posts: 4
Hallo,

ja, Subklassen war jetzt wiedersprüchlich. Gemeint ist, dass ich alle referenzierten Objekte mitladen will. Die sind auch sicher in der Datenbank.

Wenn ich die SQL-Abfragen händisch durchführe, dann bekomme ich alle entsprechende Posts (in einem Fall 1-19). Laut Hibernate-Protokoll-Ausgabe werden diese 19 Beiträge auch verarbeitet. Im Ergebnis fehlt aber der 10. Beitrag (reproduzierbar bei dem ForumThread-Objekt). Dieser wurde laut Protokoll aber verarbeitet. Es scheint fast so, als würde er nicht der Collection hinzugefügt werden. Hier hab ich keine Möglichkeit gefunden, das zu überprüfen außer eben nach dem kompletten Laden und da fehlt der Eintrag schon.

Quote:
Collections.synchronizedList wird dir übrigens nicht viel bringen, da die Collection beim Laden durch eine Hibernate Collection ersetzt wird.


Das erklärt natürlich einiges, warum die Threads immer wieder rumgesponnen haben. Das Problem taucht aber auch ohne Threads auf, hab das schon getestet.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 04, 2009 10:09 am 
Newbie

Joined: Wed Mar 04, 2009 6:40 am
Posts: 4
Kurzer Status-Bericht.

Ich habe jetzt das SortedSet in ein Vector gewandelt, was prompt mit der Meldung "cannot simultaneously fetch multiple bags" quitiert wurde. Nach Umstellung der ThreadPage auf LAZY werden jetzt aber alle Beiträge geladen und befinden sich auch im Result. Hibernate muss also aus irgendeinem Grund denken, dass es das besagte Objekt bereits geladen hat.

Mir wäre die alte Lösung aber lieber (ohne LAZY). Falls da jemand eine Idee hat, wäre ich sehr dankbar.

Wurstbrot


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 04, 2009 11:19 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Kann es sein, dass beide Beiträge die gleiche Id haben?

Wenn du von Set auf List (Vector) umstellst, wird aus einer Collection ein Bag. In einer List können Einträge doppelt vorkommen, in einem Set nicht. Das kannst du lösen, indem du einen CollectionIndex benutzt. Aber warum hast du es umgestellt? An deinem Problem hat es nichts geändert, oder?

Kannst du das Log und die generierten SQLs posten, das würde die Hilfe vereinfachen. ;-)

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 05, 2009 5:19 am 
Newbie

Joined: Wed Mar 04, 2009 6:40 am
Posts: 4
Hallo,

nein, die IDs sind alle eindeutig. Ich hab alle Daten von Hand kontrolliert, es war alles richtig. Eindeutige IDs, unterschiedliche equals-Werte (equals verwendet den Content des ForumPosts und der ist unterschiedlich). Trotzdem wurde der Beitrag nicht eingefügt.

Generell müsste die ID doch sowieso egal sein, weil beim Einfügen in die Hash doch die equals-Funktion bzw. bei einer HashSet die Hash-Funktion verwendet wird. Oder irre ich mich jetzt da?

Ich habe jetzt auf jeden Fall aus dem SortedSet ein Vektor gemacht mit einer IndexColumn (die zusätzlich generiert wurde), so dass Hibernate keine Bag, sondern wirklich eine Liste verwalten kann und es hat alles funktioniert.

Trotzdem danke für die Hilfe.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 05, 2009 10:04 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
wurstbrot wrote:
Hallo,
Generell müsste die ID doch sowieso egal sein, weil beim Einfügen in die Hash doch die equals-Funktion bzw. bei einer HashSet die Hash-Funktion verwendet wird. Oder irre ich mich jetzt da?


Nein, wenn hibernate ein Set lädt und sieht dass die Ids gleich sein, wird das Objekt gar nicht erst erstellt, da es ja bereits geladen wurde. Somit sind dabei equals und hashCode beim Laden egal.

Aber wenns nun funktionert, hat die Collection-id ja geholfen (Rating? ;-)).

_________________
-----------------
Need advanced help? http://www.viada.eu


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