Column 使用 NUMBER 型別,如何在 JPA 中用 Enum 做 mapping,且不使用 @Enumerated(EnumType.ORDINAL)
CREATE TABLE CHALLENGE_LOG (
ACTION NUMBER(1) NOT NULL
);
COMMENT ON COLUMN CHALLENGE_LOG.ACTION IS '0=Send OTP, 1=Verify OTP';
public interface PersistableEnum<T> {
T getCode();
}
import javax.persistence.AttributeConverter;
/*
Base Enum converter for JPA
*/
public abstract class AbstractEnumConverter<T extends Enum<T> & PersistableEnum<E>, E>
implements AttributeConverter<T, E> {
private final Class<T> clazz;
public AbstractEnumConverter(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public E convertToDatabaseColumn(T attribute) {
return attribute != null ? attribute.getCode() : null;
}
@Override
public T convertToEntityAttribute(E dbData) {
T[] enums = clazz.getEnumConstants();
for (T e : enums) {
if (e.getCode().equals(dbData)) {
return e;
}
}
throw new UnsupportedOperationException(
String.format("%s cannot convert to %s enum value.", dbData, clazz));
}
}
@Getter
@AllArgsConstructor
public enum ChallengeAction implements PersistableEnum<Integer> {
// 0=Send OTP, 1=Verify OTP
SEND_OTP(0),
VERIFY_OTP(1);
private final Integer code;
// JPA converter
@javax.persistence.Converter(autoApply = true)
public static class Converter extends AbstractEnumConverter<ChallengeAction, Integer> {
public Converter() {
super(ChallengeAction.class);
}
}
}
@Entity
@Data
public class ChallengeLog {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "UUID")
private String id;
private ChallengeAction action;
}
Insert
ChallengeLog challengeLog = new ChallengeLog();
challengeCodeLog.setAction(ChallengeAction.SEND_OTP);
challengeCodeRepository.save(challengeCodeLog);
// -> action 欄位為 0
Query
challengeCodeRepository.findAll();
// -> 正確將 action 欄位 mapping 成 ChallengeAction enum
hi,
could you help me to resolve get empty field from the db?
the error is
org.springframework.orm.jpa.JpaSystemException: Error attempting to apply AttributeConverter; nested exception is javax.persistence.PersistenceException: Error attempting to apply AttributeConverter, in class ...