2011-07-05 45 views
0

对于我的某个实体,我需要类似部分约束JPA:部分约束

@Entity 
public class MyEntity 
{ 
    @NotNull 
    private String name; 

    @ManyToOne @NotNull 
    private Type type; 
} 

只有一个的单层type我需要的name是唯一的。

这可能与@UniqueConstraint或我需要实现这与@PrePersist和​​听众?到目前为止,我还没有实现这样一个监听器,但即使我在这个监听器中检查了这个监听器,它是否能保证防止重复输入?

更新

假设约束应该只活跃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

我的@UniqueContraint的理解是,它可能包含列名称的列表一起定义唯一性。

参见:unique constraint check in JPA

@UniqueConstraint(columnNames={"name", "type"}) 

我希望它可以跨名称和类型强制唯一性。 (没有时间去测试)

编辑:

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

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 
+0

它是如何回答这个问题的? –

+0

@djna是的,这也是我的理解,我更新了我的示例以展示我需要的内容。 – Thor

+0

@Thor,现在我明白了我有一个想法的问题...未经测试恐怕... – djna

1

对于类似的问题,请参见conditional unique constraint。我不认为听众是定义类似事物的合适地点。我要么在数据库中实现它,在视图上使用检查约束或唯一约束,或者在应用程序中使用功能检查。

+0

感谢您的提示,我假设我可以在数据库级别上进行管理,但我会优先在JPA/Java中实现这一点。 – Thor

+2

您是否知道@UniqueConstraint仅用于生成数据库模式DDL?约束只存在于数据库中。它在数据库中被检查,而不是在JPA引擎中。如果您使用Java实现它,请将其作为功能检查来实现。但请注意,如果两个并发事务并行进行检查,然后并行插入,它将不会阻止重复。 –

+0

是的,我知道这一点。我应该在JPA中写下_describe_这个。数据库模式是在开发过程中创建的,有时是新的,我会阻止需要手动修改。如果我在@Singleton bean中进行功能检查会怎么样?这应该防止平行检查。 – Thor