繁体   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