Я хотел написать конвертер для JPA, который хранит любое перечисление как UPPERCASE. Некоторые перечисления, с которыми мы сталкиваемся, еще не придерживаются соглашения о том, чтобы использовать только буквы с верхним регистром, поэтому до тех пор, пока они не будут рефакторированы, я все еще сохраняю будущее значение.
Что я получил до сих пор:
package student;
public enum StudentState {
Started,
Mentoring,
Repeating,
STUPID,
GENIUS;
}
Я хочу, чтобы "Started" был сохранен как "НАЧАЛО" и т.д.
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;
}
конвертер в настоящее время выглядит следующим образом:
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;
}
}
что не будет работать, так это то, что я не знаю, что будет enumClass во время выполнения. И я не мог понять, как передать эту информацию в преобразователь в аннотации @Converter.
Итак, есть ли способ добавить параметры в конвертер или немного обмануть? Или есть другой способ?
Я использую EclipseLink 2.4.2
Спасибо!