我正在使用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
答案 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来保持枚举实体。
注意:在正常情况下,枚举不会更改,因此您只需设置枚举。它们是应用程序的先决条件,因此它们在极少数情况下会发生变化。