我需要对我的实体之一进行部分约束之类的东西。
@Entity
public class MyEntity
{
@NotNull
private String name;
@ManyToOne @NotNull
private Type type;
}
仅对于单一类型
,我需要名称
是唯一的。
这可以通过 @UniqueConstraint
实现吗?还是我需要使用 @PrePersist
和 @PreUpdate
监听器来实现?到目前为止我还没有实现这样的监听器,但是即使我检查这个监听器中的约束,它是否能保证防止重复条目?
更新
假设该约束仅对 type=special
有效
- 允许
{id=1,type=normal,name=Test},{id=2,type=normal,name=Test}
- 不允许:
{id=3,type=special,name=Test},{id=4,type=special,name=Test}
最佳答案
我对@UniqueContraint的理解是它可能包含共同定义唯一性的列名列表。
参见:unique constraint check in JPA
@UniqueConstraint(columnNames={"name", "type"})
我希望这能够强制名称和类型的唯一性。 (虽然没有时间测试。)
编辑:
啊哈。所以现在我明白了这个问题。对于引入第三个属性的方法怎么样:
int mySpecialValue;
该属性没有公共(public) setter 。相反,它的值由 setType() 设置,逻辑如下:
public void setType(String theType){
type = theType;
if ( "special".equals(type) ){
mySpecialValue = 0;
} else {
mySpecialValue = makeUniqueInt(); // eg. some date twiddling
}
}
现在设置唯一约束以包含 mySpecialValue。因此,对于所有特价商品,其唯一性完全取决于名称,而对于其他特价商品,始终存在差异化因素,因此名称可以重复。
Allowed {id=1,type=normal,name=Test, msv = 343223 },
{id=2,type=normal,name=Test, msv = 777654 } <== not dup
Not allowed: {id=3,type=special,name=Test, msv =0 },
{id=4,type=special,name=Test, msv =0} <== dup
关于java - JPA:部分约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582518/