[英]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.