Java 部分约束

Java 部分约束,java,jpa,constraints,jpa-2.0,Java,Jpa,Constraints,Jpa 2.0,我需要一些东西,比如我的一个实体的部分约束 @Entity public class MyEntity { @NotNull private String name; @ManyToOne @NotNull private Type type; } 仅针对单一的类型我需要名称是唯一的。 这是否可以通过@UniqueConstraint实现,还是需要通过@PrePersist和@PreUpdate侦听器实现?到目前为止,我还没有实现这样的监听器,但是即使我检查了这个监听器中的

我需要一些东西,比如我的一个实体的部分约束

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

我对@uniquecontaint的理解是,它可能包含一系列列名,这些列名共同定义了唯一性

见:

我希望这可以在名称和类型之间强制实现唯一性。(但没有时间进行测试。)

编辑:

啊哈。所以现在我明白了问题所在。对于引入第三个属性的方法来说,这样如何:

 int mySpecialValue;
此属性没有公共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  
允许{id=1,type=normal,name=Test,msv=343223},

{id=2,type=normal,name=Test,msv=777654}我对@uniquecontaint的理解是,它可能包含一系列列名,这些列名共同定义了唯一性

见:

我希望这可以在名称和类型之间强制实现唯一性。(但没有时间进行测试。)

编辑:

啊哈。所以现在我明白了问题所在。对于引入第三个属性的方法来说,这样如何:

 int mySpecialValue;
此属性没有公共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  
允许{id=1,type=normal,name=Test,msv=343223},

{id=2,type=normal,name=Test,msv=777654}有关类似问题,请参阅。我认为一个聆听者不适合定义这样的事情。我要么在数据库中实现它,在视图上使用检查约束或唯一约束,要么在应用程序中作为功能检查。

有关类似问题,请参阅。我认为一个聆听者不适合定义这样的事情。我会在数据库中实现它,在视图上使用检查约束或唯一约束,或者在应用程序中作为功能检查。

它如何回答这个问题?@djna是的,这也是我的理解,我更新了我的示例以演示我需要的。@djna有趣的解决方案,但非常适合我的需要。非常感谢。它是如何回答这个问题的?@djna是的,这也是我的理解,我更新了我的示例来演示我需要什么。@djna有趣的解决方案,但完全符合我的需要。非常感谢。谢谢您的提示,我假设我可以在数据库级别管理它,但我更愿意在JPA/Java中实现它。您知道@UniqueConstraint仅用于生成数据库模式DDL吗?约束仅存在于数据库中。检查的是数据库,而不是JPA引擎。如果您用Java实现它,那么将其作为功能检查来实现。但是请注意,如果两个并发事务并行进行检查,然后并行插入,则无法防止重复。是的,我知道这一点。我应该用JPA来描述这一点。数据库模式是在开发过程中创建的,有时是新的,我将避免手动修改的需要。如果我在@singletonbean中执行功能检查呢?这应该可以防止平行检查。我不会这么做。正如我所说,这种约束的位置是数据库。如果集群应用程序或使用JPA应用程序以外的其他方式访问数据库,则不会强制执行该约束。即使这样,单例也将是一个争用点。感谢您的提示,我假设我可以在数据库级别管理它,但我更愿意在JPA/Java中实现它。您是否知道@UniqueConstraint仅用于生成数据库模式DDL?约束仅存在于数据库中。检查的是数据库,而不是JPA引擎。如果您用Java实现它,那么将其作为功能检查来实现。但是请注意,如果两个并发事务并行进行检查,然后并行插入,则无法防止重复。是的,我知道这一点。我应该用JPA来描述这一点。数据库模式是在开发过程中创建的,有时是新的,我将避免手动修改的需要。如果我在@singletonbean中执行功能检查呢?这应该可以防止平行检查。我不会这么做。正如我所说,这种约束的位置是数据库。如果集群应用程序或使用JPA应用程序以外的其他方式访问数据库,则不会强制执行该约束。即使这样,单身汉也会成为争论的焦点。