Ich suche nach verschiedenen Möglichkeiten, eine Enumeration mit JPA abzubilden. Ich möchte insbesondere den Integer-Wert jedes Enum-Eintrags festlegen und nur den Integer-Wert speichern.
@Entity
@Table(name = "AUTHORITY_")
public class Authority implements Serializable {
public enum Right {
READ(100), WRITE(200), EDITOR (300);
private int value;
Right(int value) { this.value = value; }
public int getValue() { return value; }
};
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "AUTHORITY_ID")
private Long id;
// the enum to map :
private Right right;
}
Eine einfache Lösung besteht darin, die Annotation Enumerated mit EnumType.ORDINAL zu verwenden:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
In diesem Fall bildet JPA jedoch den Enum-Index (0,1,2) und nicht den gewünschten Wert (100.200.300) ab.
Die beiden Lösungen, die ich gefunden habe, scheinen nicht einfach zu sein ...
Erste Lösung
Eine hier vorgeschlagene Lösung verwendet @PrePersist und @PostLoad, um die Aufzählung in ein anderes Feld zu konvertieren und das Aufzählungsfeld als vorübergehend zu markieren:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Zweite Lösung
Die zweite hier vorgeschlagene Lösung schlug ein generisches Konvertierungsobjekt vor, scheint jedoch immer noch schwer und auf den Ruhezustand ausgerichtet zu sein (@Type scheint in Java EE nicht zu existieren):
@Type(
type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType",
parameters = {
@Parameter(
name = "enumClass",
value = "Authority$Right"),
@Parameter(
name = "identifierMethod",
value = "toInt"),
@Parameter(
name = "valueOfMethod",
value = "fromInt")
}
)
Gibt es noch andere Lösungen?
Ich habe mehrere Ideen, aber ich weiß nicht, ob sie in JPA existieren:
- Verwenden Sie beim Laden und Speichern des Authority-Objekts die Setter- und Getter-Methoden des rechten Mitglieds der Authority-Klasse
- Eine äquivalente Idee wäre, JPA mitzuteilen, welche Methoden Right Enum verwendet, um Enum in Int und Int in Enum umzuwandeln
- Gibt es eine Möglichkeit, JPA anzuweisen, einen bestimmten Konverter (RightEditor) zu verwenden, da ich Spring verwende?