JPA:部分约束

时间:2011-07-05 12:18:44

标签: java jpa constraints jpa-2.0

我的某个实体需要类似部分约束的内容。

@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}

2 个答案:

答案 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。我认为听众不是定义这样的事情的合适场所。我要么在数据库中实现它,要么在视图上使用检查约束或唯一约束,要么在应用程序中作为功能检查。