java - JPA:部分约束

标签 java jpa constraints jpa-2.0

我需要对我的实体之一进行部分约束之类的东西。

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

相关文章:

java - 了解色度键

sql-server-2005 - sql server drop默认语法错误

c++ - 对如何在 c++ 中编写 for 循环(包括 for all 加法)感到困惑

ios - 如何将所有内容对齐 Xcode 中心

java - 使用 Java、AJAX 使用 Rest Web 服务将表单数据插入 MySQL 数据库

java - Firebase addValueEventListener 在其他 Activity 中持续监听

java - JavaFX FXMLLoader 上的 NullPointer 位置

java - 更新包含对象字段的实体

java - 如何通过JPA获取保存对象的id?

java - 实现多个表的 JOIN