我的某个实体需要类似部分约束的内容。
@Entity
public class MyEntity
{
@NotNull
private String name;
@ManyToOne @NotNull
private Type type;
}
仅针对犯罪分子type
我需要name
是唯一的。
这可能是@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}
答案 0 :(得分:2)
我对@UniqueContraint的理解是它可能包含一起定义唯一性的列名列表。
请参阅:unique constraint check in JPA
@UniqueConstraint(columnNames={"name", "type"})
我希望这可以强制实现名称和类型的唯一性。 (没时间测试。)
编辑:
啊哈。所以现在我明白了这个问题。如何为方法引入第三个属性:
int mySpecialValue;
此属性没有公共设置器。相反,它的值由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
答案 1 :(得分:1)
有关类似问题,请参阅conditional unique constraint。我认为听众不是定义这样的事情的合适场所。我要么在数据库中实现它,要么在视图上使用检查约束或唯一约束,要么在应用程序中作为功能检查。