JPA和Bean Validation的唯一约束

dea*_*mon 37 java validation jpa unique bean-validation

我想对@UniqueBean Validation 有一个约束,但标准不提供.如果我使用JPA,@UniqueConstraint我就没有独特的验证和错误报告机制.

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

Pas*_*ent 50

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

BV规范总结如下:

附录D. Java Persistence 2.0集成

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

@Unique无法在Java级别可靠地进行测试,但可以生成数据库唯一约束生成.@Unique今天不属于BV规范.

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

参考

  • 那么检查并告诉用户输入的值已经存在的正确方法是什么?提交时抛出的异常(及其消息)不能显示给用户.无论如何,人们将实现他们自己的@Unique(例如http://lucasterdev.altervista.org/wordpress/2012/07/28/unique-constraint-validation-part-1/),即使风险很小并发事务修改检查和提交之间的数据. (11认同)
  • 这感觉太理想化了。许多其他 Web 框架(例如 Rails、Django 等)包括唯一性检查,它们面临着完全相同的问题。这是一个问题是完全正确的,但它仍然应该是一个带有警告的可用选项。如果其他框架可以管理它,我认为 Java 还不够特殊,认为它在它们之上。 (4认同)

Har*_*rdy 5

有关如何实现@Unique以及围绕它的问题的更多信息可以在这里找到 - http://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator