我想创建一个实体,它有两个相互排斥的字段,即两个字段中只有一个或另一个应该包含一个值。有没有我可以用来实现这个的注释,还是我需要通过其他方式来做到这一点?
答案 0 :(得分:2)
JPA不提供实现互斥字段的机制,但您可以在字段的setter中实现此功能。最终实现取决于您想要实现的确切行为。
要明确禁止同时设置2个字段,请使用
之类的内容@Entity
public class MutuallyExclusive1 {
@Id
@GeneratedValue
private int Id;
private String strValue;
@Enumerated(EnumType.STRING)
private MyEnum enumValue;
public MutuallyExclusive1() {
// do nothing
}
public void setEnum(final MyEnum enumValue) {
if (strValue != null) {
throw new IllegalStateException("stgValue and enumValue cannot be populated at the same time!");
}
this.enumValue = enumValue;
}
public void setString(final String strValue) {
if (enumValue != null) {
throw new IllegalStateException("stgValue and enumValue cannot be populated at the same time!");
}
this.strValue = strValue;
}
}
在设置其他用途时隐式删除一个值
@Entity
public class MutuallyExclusive2 {
@Id
@GeneratedValue
private int Id;
private String strValue;
@Enumerated(EnumType.STRING)
private MyEnum enumValue;
public MutuallyExclusive2() {
// do nothing
}
public void setEnum(final MyEnum enumValue) {
this.strValue = null;
this.enumValue = enumValue;
}
public void setString(final String strValue) {
this.enumValue = null;
this.strValue = strValue;
}
}
无论哪种方式,您都应该记住,您的实施只会强制实施互斥。这意味着你应该只使用 上面的setter来对这些字段进行写访问,或者在每个方法中实现相同的逻辑,对它们有写访问权。
答案 1 :(得分:1)
class Exclusive{
private String value1 = null;
private Enum value2 = null;
public Exclusive(){
....
}
public void setValue1(String s){
value1 = s;
value2 = null;
}
public void setValue2(Enum e){
value2 = e;
value1 = null;
}
}