2009-06-01 12 views
4

Ich habe Probleme, einen Ruhezustand auszuwählen, um ein korrekt gefülltes Objektdiagramm zurückzugeben, wenn das Auswählen Joins in vielen Sammlungen enthält.Hibernate - Auswahl über mehrere Joins mit Sammlungen

ZB:

String sql = "select distinct changeset " + 
      "from Changeset changeset " + 
      "join fetch changeset.changeEntries as changeEntry " + 
      "join fetch changeEntry.repositoryEntity as repositoryEntity " + 
      "join fetch repositoryEntity.repository as repository " + 
      "where repository.connectionName = :connectionName"; 
  • A Changeset hat viele ChangeEntries
  • A ChangeEntry hat ein RepositoryEntity
  • A RepositoryEntity hat ein Repository

Die obige Aussage die richtigen Daten zurückgibt, aber das Objektdiagramm ist nicht korrekt gefüllt - dh jedes Changeset enthält jede ChangeE ntry, nicht nur seine eigenen Kinder.

Hier die entsprechenden Schnipsel dieser beiden Klassen:

public class Changeset { 

    @NotNull 
    @OneToMany(mappedBy="changeset", targetEntity=ChangeEntry.class, cascade={CascadeType.ALL }, fetch=FetchType.EAGER) 
    private Set<IChangeEntry> changeEntries; 

Und ...

public class ChangeEntry { 

    @NotNull 
    @ManyToOne(targetEntity=Changeset.class) 
    @ForeignKey(name="FkChangeEntryChangeset") 
    private IScmChangeset changeset; 

    @NotNull 
    @ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    @ForeignKey(name="FkChangeEntryRepoEntity") 
    private IRepositoryEntity repositoryEntity; 

Jede mögliche Unterstützung stark

geschätzt

Grüße

Marty

+0

Sie haben die Zuordnungsinformationen für Repository hinzugefügt, nicht für ChangeSet in ChangeEntry. – rudolfson

+0

Danke - Ich habe Changeset hinzugefügt –

Antwort

1

Marty:

Ich hatte das gleiche Problem und ich konnte keine geeignete Lösung finden. Sie können einfache Ergebnis Transformatoren verwenden, um die Anzahl der Objekte zu steuern, die zurückgegeben werden:

CriteriaSpecification.ROOT_ENTITY 
CriteriaSpecification.DISTINCT_ROOT_ENTITY 

Aber die Objekte würden immer die vollständigen Ergebnisse für ihre Kinder enthalten. Ich passierte über einen ausgezeichneten Artikel, der ein DTO-Muster zusammen mit Projektionen und dem aliasToBean Transformator verwendet.

Hier ist sie: http://swik.net/Hibernate/Hibernate+GroupBlog/Hibernate+3.2:+Transformers+for+HQL+and+SQL/cmxs

Das ist für mich gut funktioniert hat. Das größte Problem ist, dass Sie diese abgeflachten DTO-Objekte erstellen müssen. Für mich ist es nicht so ein großes Problem, weil meine spezialisierten DTO-Objekte in Suchergebnissen verwendet werden und sehr wiederverwendbar sind, und ich werde nicht sehr viele von ihnen benötigen.

Ich weiß, dass dies nicht direkt Ihr Problem anspricht, wenn Sie einen Weg finden, Ihr Ziel zu erreichen, bitte aktualisieren Sie den Beitrag, wie ich gerne die Lösung sehen würde.

0

Funktioniert das Laden einer Entität mit ihrer ID korrekt? Wenn nicht - weiterlesen. :-)

Ich bin mir nicht sicher, ob die Verwendung von @ForeignKey genug ist. Versuchen Sie, eine @JoinColumn auf die vielen Seiten Ihrer Beziehung hinzuzufügen. Z.B.

@NotNull 
@ManyToOne(targetEntity=RepositoryEntity.class, cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
@ForeignKey(name="FkChangeSet") 
@JoinColumn(name = "CHANGESET_ID", referencedColumnName = "ID") 
private Changeset changeset; 

Hinweis: Ich habe gerade gesehen, dass Sie die Zuordnung Informationen für Repository sind zeigt, aber ich nehme an, die man für Changeset ähnlich sieht.

+0

Vielen Dank für die Antwort ... ja, Laden einer Entität durch die ID funktioniert. Die @JoinColumn sollte nicht notwendig sein, da Hibernate das aus der targetEntity von @ManyToOne herausarbeiten kann. Die @ForeignKey-Annotation existiert nur, um dem fremden Schlüssel einen Namen zu geben, so dass ich bedeutungsvolle Fehler bekommen kann, wenn Dinge schief gehen (wie sie es häufig tun!) –

+0

Betreffend @ForeignKey - das ist, was ich vermutete. Concerning @JoinColumn - müssen Sie nicht den Namen der Fremdschlüssel Spalte zu sagen. Die referenzierte Spalte kann von der Zieleinheit aufgelöst werden, das ist richtig. Aber die Fremdschlüsselspalte? – rudolfson