簡體   English   中英

如何堅持使用JPA的枚舉?

[英]How to persist an enum with JPA?

我正在使用MySQL和JPA。

我有一個枚舉,它有自己的表。

我在實體(entity1)中有一個使用此枚舉的字段。 該字段注釋為: @Enumeration(EnumType.STRING)

1 - 在擁有它自己的表時,在entity1中將此字段作為db中的列保留是正確的嗎?

2 - 如果我在其他字段上使用@JsonProperty並且回答1是“是”,那么我也必須在枚舉字段上使用@JsonProperty嗎?

3 - 將枚舉放在單獨的表中有什么意義?

目前,只有@Enumeration注釋和entity1的枚舉列我得到錯誤: was annotated as enumerated, but its java type is not an enum

1-我如何處理類似的問題如下:

我在一個單獨的實體中定義了枚舉:

@Entity
@Table(name="CALC_METHOD")
public class CalculationMethod {


public CalculationMethod() {
    super();
    // TODO Auto-generated constructor stub
}


@Id
@Enumerated(EnumType.STRING)
@Column(name="METHOD_NAME")
private CalculationMethodId calcMethodID;

@Column(name="DISPLAY_TEXT")
private String displayName;
.
.
.
.

然后我在另一個實體中提到它如下:

@OneToOne
@JoinColumn(name="CALCULATION_METHOD",referencedColumnName="METHOD_NAME")
private CalculationMethod calculationMethod;

這種方式它存儲在一個單獨的表中,但是從另一個沒有重復的實體引用...這里的要點是你不能映射枚舉范圍的變量,所以當我需要存儲枚舉值的顯示名稱時,我需要如你所見,使它成為一個單獨的屬性

3-為什么要將它存放在桌子上? 因為從java POV它真的是一個枚舉,我想多態地應用一些計算方法(比如使用計算方法在引用實體中計算一些值,所以我為每個計算方法定義了calculate()方法,每個都有不同的實現然后在計算整數時調用它)我希望它總是以相同的值讀取並在代碼中的許多地方顯示名稱,如果我想修改顯示名稱,它只完成@一個地方 - 正一致性和可維護性 -

2-這取決於要求和你的json模型

根據您的情況,我通常使用BBDD上的實體作為ENUM:

AuthenticationType
id, name, value : (0, CERT, Certificate)

其中name是真正的ENUM,value是我想在視圖上表示的文本。

為此,您需要以下內容:

public enum AuthenticationTypeEnum{
   CERT, PASS;
}

@Entity
@Table(name = "AuthenticationType")
public class AuthenticationType{
    @Column(name = "ID")
    private Long id;
    @Column(name = "NAME")
    @Enumerated(EnumType.STRING)
    private AuthenticationTypeEnum name; // REAL ENUM TYPE
    @Column(name = "VALUE")
    private String value;
    ....
}

@Entity...
class Authentication{
    private String login;
    ...
    @ManyToOne
    private AuthenticationType type; // ENUM USE
    ...
}

通過這種方式,您可以在不更改代碼的情況下在BBDD上編輯ENUM的值,對我而言,這是最佳選擇之一。 希望這可以幫助。

當你持久化實體時,在JPA上使用cascade all來持久化enum實體。

注意:在正常情況下,枚舉不會更改,因此您只設置枚舉。 它們是應用程序的先決條件,因此它們在極少數情況下會發生變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM