2016-03-29 6 views
2

Ich habe die folgenden zwei Felder in einer Hibernate Einheit verwaltet:Entity zwei Aufzählungen enthält, aber Hibernate multipliziert die beibehaltenen Werte

@ElementCollection(targetClass = PersonAttributes.class, fetch = FetchType.EAGER) 
@Enumerated(EnumType.STRING) 
@CollectionTable(name = "PERSON_ATTRIBUTES", joinColumns = { @JoinColumn(name = "PERSON_ID") }) 
@Column(name = "ATTRIBUTES") 
private List<PersonAttributes> attributes; 

@ElementCollection(targetClass = PersonRoles.class, fetch = FetchType.EAGER) 
@Enumerated(EnumType.STRING) 
@CollectionTable(name = "PERSON_ROLES", joinColumns = { @JoinColumn(name = "PERSON_ID") }) 
@Column(name = "ROLES") 
private List<PersonRoles> roles; 

Wenn ich wählen zwei PersonAttributes Werte und zwei PersonRoles Werte und bleiben die Einheit, auf das Lesen Aus der Datenbank werden die Werte multipliziert.

Beispiel:

Persisting roles = [ADMIN, SUPERVISOR] und Attribute = [ATTRIBUTE1, ATTRIBUTE2]. Beim Lesen der Entität aus der Datenbank bekomme ich Rollen = [ADMIN, SUPERVISOR, ADMIN, SUPERVISOR] und Attribute = [ATTRIBUTE1, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE2].

Ein weiteres Beispiel:

Persisting roles = [ADMIN] und Attribute = [ATTRIBUTE1, ATTRIBUTE2]. Beim Lesen der Entität aus der Datenbank bekomme ich Rollen = [ADMIN, ADMIN] und Attribute = [ATTRIBUTE1, ATTRIBUTE2].

Sieht da ist ein unerwarteter Beitritt? Wie kann ich Hibernate die persistierten Enumerationen ohne diese Kreuz-Multiplikation lesen? Weitere Informationen: Dies tritt auf, wenn ich die entityManager.find() Methode verwende. Aber wenn ich alle Entitäten als Liste über JPQL SELECT-Anweisung bekomme, sind die Enumerationen angemessen.

+0

also schauen, was persistent ist und die SQL aufgerufen, um es zu erhalten, und dann schauen Sie sich die SQL aufgerufen, um die Felder abzurufen. –

Antwort

1

Schauen Sie sich diese Antwort bitte @OneToMany List<> vs Set<> difference.

Sie können nicht mehr als eine java.util.List in Entität abrufen. Verwenden Sie java.util.Set anstelle von List, wenn Sie mehr als eine Collection an Ihre Entität anhängen möchten.

+0

In JPA kann eine Klasse mehr als ein Listenfeld __haben__. JPA soll die Benutzerklasse beibehalten und keine willkürlichen Einschränkungen für die Felder, die der Benutzer haben kann oder nicht, auferlegen. Der Link besagt, dass __Hibernate__ nicht mehr als eine Liste in einem Aufruf abrufen kann. Das Schlüsselwort dort ist _retrieve_ not _use_ –

+0

Neil, du hast richtig gesagt, ich habe diese Situation falsch ausgedrückt. Ich habe die Antwort geändert. – sanluck

+0

Ok, aber das behebt das Problem des Benutzers nicht. Nur weil Hibernate 2 Listen in einem SQL nicht zuverlässig abrufen kann, bedeutet dies nicht, dass Hibernate versuchen sollte, 2 Listen in einem SQL abzurufen. Wenn es weiß, dass es das nicht kann, dann sollte es in 2 SQL-Anweisungen abrufen. Der Benutzer sollte immer die Daten erhalten, die sie beibehalten haben. Wenn nicht, dann ist das ein Hibernate Bug. Ist es ein Hibernate Bug? –

Verwandte Themen