JPA和Bean Validation的唯一约束

时间:2010-08-16 16:53:07

标签: java validation jpa unique bean-validation

我希望Bean Validation具有@Unique约束,但标准不提供。如果我使用JPA的@UniqueConstraint,我就没有独特的验证和错误报告机制。

有没有办法将@Unique定义为Bean Validation约束并将其与JPA组合,以便JPA创建一个具有唯一约束的列并检查值是否唯一?

4 个答案:

答案 0 :(得分:50)

除非你获得整个表的锁,否则基本上不可能使用SQL查询检查unicity(任何并发事务都可以在手动检查之后但在提交之前修改数据持续交易)。换句话说,不可能在Java级别实现有效的唯一验证,从而提供验证实现。检查unicity的唯一可靠方法是提交事务。

BV规范总结如下:

  

Appendix D. Java Persistence 2.0 integration

     

问题:我们应该添加@Unique吗?   会映射到@Column(unique = true)?

     

@Unique无法在Java上进行测试   水平可靠,但可能产生一个   数据库唯一约束生成。   @Unique不属于BV规范   今天。

因此,虽然我同意在Bean Validation异常中包含唯一(和非null)约束违规会很好,但目前情况并非如此。

参考

答案 1 :(得分:5)

有关如何实施@Unique及其周围存在问题的更多信息,请访问此处 - http://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

答案 2 :(得分:3)

嗯,你可以做到,但这不是微不足道的。问题是:如果要插入的值已经存在,验证器需要数据库访问才能执行一些查询以进行检查。这不能通过验证器真正完成,因为它无法访问sessionFactory / session。当然你可以在验证器中实例化它(session / sessionFactory),但这不是一个好的编码实践。

答案 3 :(得分:2)

您可以让验证程序读取JPA注释并应用它。这里有一个使用弹簧验证器的例子,可以作为扩展的想法。

JPA JSR303 Spring Form Validation

您还可以在自定义验证器中注入(@Inject或Spring @Autowired)会话bean,容器应该知道如何连接它。我只知道这是一个Spring的例子:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

@Autowired //@Inject
private Foo aDependency;

...
}