Ist es möglich, einen generischen Enum-Konverter für JPA zu schreiben?
Ich wollte einen Konverter für JPA schreiben, der alle Aufzählungen als GROSSBUCHSTABEN speichert. Einige Aufzählungen, auf die wir stoßen, folgen noch nicht der Konvention, nur Großbuchstaben zu verwenden. Bis sie überarbeitet werden, speichere ich den zukünftigen Wert.
Was ich bisher bekommen habe:
package student;
public enum StudentState {
Started,
Mentoring,
Repeating,
STUPID,
GENIUS;
}
Ich möchte, dass "Gestartet" als "GESTARTET" usw. gespeichert wird.
package student;
import jpa.EnumUppercaseConverter;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "STUDENTS")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mId;
@Column(name = "LAST_NAME", length = 35)
private String mLastName;
@Column(name = "FIRST_NAME", nullable = false, length = 35)
private String mFirstName;
@Column(name = "BIRTH_DATE", nullable = false)
@Temporal(TemporalType.DATE)
private Date mBirthDate;
@Column(name = "STUDENT_STATE")
@Enumerated(EnumType.STRING)
@Convert(converter = EnumUppercaseConverter.class)
private StudentState studentState;
}
Der Konverter sieht momentan so aus:
package jpa;
import javax.persistence.AttributeConverter;
import java.util.EnumSet;
public class EnumUppercaseConverter<E extends Enum<E>> implements AttributeConverter<E, String> {
private Class<E> enumClass;
@Override
public String convertToDatabaseColumn(E e) {
return e.name().toUpperCase();
}
@Override
public E convertToEntityAttribute(String s) {
// which enum is it?
for (E en : EnumSet.allOf(enumClass)) {
if (en.name().equalsIgnoreCase(s)) {
return en;
}
}
return null;
}
}
was nicht funktionieren wird ist, dass ich nicht weiß, welche enumClass zur Laufzeit sein wird. Und ich konnte keine Möglichkeit finden, diese Informationen in der @ Converter-Annotation an den Konverter weiterzuleiten.
Gibt es also eine Möglichkeit, dem Konverter Parameter hinzuzufügen oder ein bisschen zu schummeln? Oder gibt es einen anderen Weg?
Ich verwende EclipseLink 2.4.2
Vielen Dank!