如何坚持使用JPA的枚举?

时间:2018-02-11 14:39:45

标签: java mysql hibernate jpa enums

我正在使用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

2 个答案:

答案 0 :(得分:0)

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;

这种方式它存储在一个单独的表中,但是从另一个没有重复的实体引用...这里的要点是你不能映射enum范围的变量,所以当我需要存储一个显示时枚举值的名称,我需要使它成为一个单独的属性,如你所见

3-为什么要把它存放在桌子里?因为从java POV它真的是一个枚举,我想多态地应用一些计算方法(比如使用计算方法在引用实体中计算一些值,所以我为每个计算方法定义了calculate()方法,每个都有一个不同的实现,然后在计算整体时调用它)我希望它始终用相同的值读取并显示代码中许多地方的名称,如果我想修改显示名称,它只完成@ one -thus一致性和可维护性 -

2-这取决于要求和你的json模型

答案 1 :(得分:0)

根据您的情况,我通常使用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来保持枚举实体。

注意:在正常情况下,枚举不会更改,因此您只需设置枚举。它们是应用程序的先决条件,因此它们在极少数情况下会发生变化。