Gibt es in JPA eine Möglichkeit, eine Sammlung von Aufzählungen innerhalb der Entitätsklasse zuzuordnen? Oder besteht die einzige Lösung darin, Enum mit einer anderen Domänenklasse zu versehen und damit die Sammlung zuzuordnen?
@Entity
public class Person {
public enum InterestsEnum {Books, Sport, etc... }
//@???
Collection<InterestsEnum> interests;
}
Ich verwende die HPA-Implementierung von Hibernate, würde aber natürlich eine implementierungsunabhängige Lösung bevorzugen.
java
jpa
jakarta-ee
Gennady Shumakher
quelle
quelle
Der Link in Andys Antwort ist ein guter Ausgangspunkt für die Zuordnung von Sammlungen von "Nicht-Entity" -Objekten in JPA 2, ist jedoch bei der Zuordnung von Aufzählungen nicht vollständig. Hier ist, was ich mir stattdessen ausgedacht habe.
quelle
@ElementCollection
undCollection<InterestsEnum> interests;
Der Rest ist möglicherweise nützlich, aber unnötig. Fügt beispielsweise von@Enumerated(EnumType.STRING)
Menschen lesbare Zeichenfolgen in Ihre Datenbank ein.@Column
,name
dass das impliziert wird. Ich wollte nur klarstellen, was impliziert wird, wenn @Column weggelassen wird. Und @Enumerated wird immer empfohlen, da Ordnungszahlen eine schreckliche Sache sind. :)@CollectionTable(name="person_interest", joinColumns = {@JoinColumn(name="person_id")})
Dies konnte ich auf einfache Weise erreichen:
Eifriges Laden ist erforderlich, um ein verzögertes Laden zu vermeiden, wie hier erläutert .
quelle
Ich verwende eine geringfügige Änderung von java.util.RegularEnumSet, um ein dauerhaftes EnumSet zu erhalten:
Diese Klasse ist jetzt die Basis für alle meine Aufzählungssätze:
Und dieses Set kann ich in meiner Entität verwenden:
Vorteile:
java.util.EnumSet
Beschreibung siehe )Nachteile:
RegularEnumSet
undPersistentEnumSet
sind fast gleich)EnumSet.noneOf(enumType)
in yourPersistenEnumSet
einbinden, deklarierenAccessType.PROPERTY
und zwei Zugriffsmethoden bereitstellen, die Reflektion zum Lesen und Schreiben deselements
Felds verwenden@Embeddable
zuPersistentEnumSet
und die Extraklasse fallen (... interests = new PersistentEnumSet<>(InterestsEnum.class);
)@AttributeOverride
, wie in meinem Beispiel angegeben, wenn Sie mehr als einesPersistentEnumSet
in Ihrer Entität haben (andernfalls würden beide in derselben Spalte "Elemente" gespeichert).values()
mit Reflexion im Konstruktor ist nicht optimal (insbesondere wenn man die Leistung betrachtet), aber die beiden anderen Optionen haben auch ihre Nachteile:EnumSet.getUniverse()
verwendet einesun.misc
Klassequelle
Eine kurze Lösung wäre die folgende:
Die lange Antwort lautet, dass JPA mit diesen Anmerkungen eine Tabelle erstellt, die die Liste von InterestsEnum enthält, die auf die Hauptklassen-ID (in diesem Fall Person.class) verweist.
@ElementCollections geben an, wo JPA Informationen zur Aufzählung finden kann
@CollectionTable erstellt die Tabelle, die die Beziehung von Person zu InterestsEnum enthält
@Enumerated (EnumType.STRING) weist JPA an, die Aufzählung als Zeichenfolge beizubehalten. Dies könnte EnumType.ORDINAL sein
quelle
Sammlungen in JPA beziehen sich auf Eins-zu-Viele- oder Viele-zu-Viele-Beziehungen und können nur andere Entitäten enthalten. Entschuldigung, aber Sie müssten diese Aufzählungen in eine Entität einschließen. Wenn Sie darüber nachdenken, benötigen Sie ein ID-Feld und einen Fremdschlüssel, um diese Informationen trotzdem zu speichern. Es sei denn, Sie tun etwas Verrücktes wie das Speichern einer durch Kommas getrennten Liste in einem String (tun Sie dies nicht!).
quelle