Volevo scrivere un convertitore per JPA che memorizza qualsiasi enumerazione come MAIUSCOLE. Alcune enumerazioni che incontriamo non seguono ancora la convenzione per usare solo lettere maiuscole così finché non vengono refactored, conservo ancora il valore futuro.È possibile scrivere un convertitore enum generico per JPA?
Quello che ho ottenuto finora:
package student;
public enum StudentState {
Started,
Mentoring,
Repeating,
STUPID,
GENIUS;
}
che voglio "Started" per essere memorizzato come "Avviato" e così via.
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;
}
il convertitore attualmente appare così:
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;
}
}
ciò che non funziona è che io non so che cosa enumClass sarà in fase di esecuzione. E non sono riuscito a trovare un modo per passare queste informazioni al convertitore nell'annotazione @Converter.
Quindi c'è un modo per aggiungere parametri al convertitore o imbrogliare un po '? oppure c'è un'altro modo?
sto usando EclipseLink 2.4.2
Grazie!
Attenzione che è probabile che sia fragile, soprattutto perché è perfettamente legale che un enum abbia valori "VALUE" e "VALORE". – chrylis
sì è vero ma lo definisco assolutamente vietato: D – wemu