JPA kullanarak bir numaralandırma eşlemek için farklı yollar arıyorum. Özellikle her numaralandırma girişinin tamsayı değerini ayarlamak ve sadece tamsayı değerini kaydetmek istiyorum.
@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;
}
Basit bir çözüm EnumType ile Numaralandırılmış ek açıklamayı kullanmaktır: ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Ancak bu durumda JPA, istediğim değeri (100,200,300) değil, numaralandırma dizinini (0,1,2) eşler.
Bulduğum iki çözüm basit görünmüyor ...
İlk Çözüm
Burada önerilen bir çözüm, numaralandırmayı başka bir alana dönüştürmek ve numaralandırma alanını geçici olarak işaretlemek için @PrePersist ve @PostLoad kullanır:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
İkinci Çözüm
Burada önerilen ikinci çözüm genel bir dönüşüm nesnesi önerdi, ancak yine de ağır ve hazırda bekletme odaklı görünüyor (@Type, Java EE'de mevcut görünmüyor):
@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")
}
)
Başka çözüm var mı?
Aklımda birkaç fikir var ama JPA'da var olup olmadıklarını bilmiyorum:
- Authority nesnesini yüklerken ve kaydederken Authority Class'ın sağ üyesinin ayarlayıcı ve alıcı yöntemlerini kullanın
- eşdeğer bir fikir, JPA'ya enum'u int ve int'e enum'a dönüştürmek için Sağ numaralandırma yöntemlerinin neler olduğunu söylemek olacaktır.
- Spring kullandığım için, JPA'ya belirli bir dönüştürücü (RightEditor) kullanmasını söylemenin bir yolu var mı?