Hibernate gibt doppelte, da eine andere Tabelle doppelte Werte
Also ich habe eine Tabelle Benutzer Tabelle Projekte und User_Roles Tabelle. Ich habe einen Benutzer, die verbunden ist, um 2 Projekte, aber wenn ich nur eine Rolle für ihn gibt es diese 2 Projekte, aber wenn ich 2 Rollen für ihn gibt es 4 Rollen (2x2-Projekte). Wie kann ich verhindern, dass diese
Dies ist mein code für die Rückgabe der Liste der Projekte für die Nutzer
@Override
public List<Project> retrieve(User user) {
Criteria criteria = super.createCriteria();
criteria.addOrder(Order.desc("date"));
criteria.createCriteria("users").add(Restrictions.eq("id", user.getId()));
return (List<Project>) criteria.list();
}
Zuordnungen in der User-Klasse
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Users_Projects",
joinColumns = @JoinColumn(name = "UserID"), inverseJoinColumns = @JoinColumn(name = "ProjectID"))
public List<Project> getProjects() {
return projects;
}
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@Column(name = "RoleType")
@JoinTable(name = "User_Roles", joinColumns = @JoinColumn(name = "UserID"))
public Set<Role> getRoles() {
return roles;
}
Irgendwelche Vorschläge, was ist hier das problem?
tnx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Klassiker "fix" für die Probleme von doppelten Zeilen von Kriterien Abfragen, das funktioniert wahrscheinlich so lange, wie Sie versuchen nicht, das zu kombinieren, mit Paginierung, hinzufügen
Ich glaube, dies geschieht, in Ihrer situation, da sich der eager loading für die Benutzer-Rollen. Ändern, dass Sie zu faul sein, vielleicht auch Arbeit, und arbeiten auch weiter, wenn Sie brauchen Paginierung.
Einstellung
fetch = FetchType.EAGER
weist hibernate, die Sie möchten, laden Sie immer alle Rollen für die Benutzer, wenn Sie ein Benutzer abgerufen, die es erreicht, indem Sie immer tun, einen join zu der Rollen-Tabelle.Leider, dass sql führt mehrere Datensätze mit dem gleichen user (einen für jede Rolle), und hat es dann zurechtgebogen werden in Java nach sql ausgeführt wird, was das Ergebnis Transformator funktioniert.
Viel mehr leider, wenn Sie verwenden möchten, Blättern in der natürlichste Weg, mit einfachen Ruhezustand Kriterien, mit
criteria.setFirstResult
undcriteria.setMaxResults
, die Dinge passieren in der falschen Reihenfolge, so dass diese Abfragen, müssen die Ergebnis-Transformator um Duplikate zu vermeiden, nur nicht die Rechte Seite.Alles zu verstehen, die den hibernate-sql-generation ein bisschen besser ist, würde ich raten, einschalten der Protokollierung der generierten sql wie beschrieben in diese Antwort zu einem anderen, SO dass hibernate Frage.