Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有JPA和Bean验证的唯一约束_Java_Validation_Jpa_Unique_Bean Validation - Fatal编程技术网

Java 具有JPA和Bean验证的唯一约束

Java 具有JPA和Bean验证的唯一约束,java,validation,jpa,unique,bean-validation,Java,Validation,Jpa,Unique,Bean Validation,我希望有一个带有Bean验证的@Unique约束,但这不是标准提供的。如果我使用JPA的@UniqueConstraint,我就不会有唯一的验证和错误报告机制 有没有办法将@Unique定义为一个Bean验证约束,并将其与JPA结合起来,这样JPA就可以创建一个具有唯一约束的列,并检查值是否唯一?您可以这样做,但这并不是一件小事。问题是:验证器需要数据库访问来执行一些查询以检查您要插入的值是否已经存在。而这实际上不能从验证器完成,因为它没有访问sessionFactory/会话的权限。当然,您可

我希望有一个带有Bean验证的
@Unique
约束,但这不是标准提供的。如果我使用JPA的
@UniqueConstraint
,我就不会有唯一的验证和错误报告机制


有没有办法将
@Unique
定义为一个Bean验证约束,并将其与JPA结合起来,这样JPA就可以创建一个具有唯一约束的列,并检查值是否唯一?

您可以这样做,但这并不是一件小事。问题是:验证器需要数据库访问来执行一些查询以检查您要插入的值是否已经存在。而这实际上不能从验证器完成,因为它没有访问sessionFactory/会话的权限。当然,您可以在验证器中实例化它(session/sessionFactory),但这不是一个好的编码实践。

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

BV规范对其进行了如下总结:

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

@无法在Java服务器上测试Unique 级别可靠,但可以生成 数据库唯一约束生成。 @“唯一”不是BV规范的一部分 今天

因此,虽然我同意在Bean验证异常中包装唯一(且非null)约束冲突会很好,但目前情况并非如此

工具书类
  • Bean验证规范(JSR303)

您可以让验证器读取JPA注释并应用它。下面是一个使用spring验证器的示例,可以作为扩展的想法

您还可以在自定义验证器中插入会话bean(
@inject
或Spring的
@Autowired
),容器应该知道如何将其连接起来。我只知道Spring的一个示例:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

@Autowired //@Inject
private Foo aDependency;

...
}

有关如何实现@Unique及其相关问题的更多信息,请参见此处-

…正如Pascal Thivent指出的那样,它可能会导致并发问题。那么,检查并告知用户输入的值已经存在的正确方法是什么呢?异常(及其消息)提交时抛出的不是可以向用户显示的东西。人们无论如何都会实现自己的@Unique(例如,在这里),即使并发事务在检查和提交之间修改数据的风险很小。这感觉太理想化了。许多其他web框架(例如Rails、Django等)包括唯一性检查,它们面临着完全相同的问题。这是一个完全正确的问题,但它仍然应该是一个带有警告的可用选项。如果其他框架可以管理它,我不认为Java特别到可以认为它高于他们。@user2490003关于理想主义是正确的;谢谢你注释。DBMS上的唯一约束是引入无效数据的最后一个后盾。检查唯一约束是否即将被违反,并生成一致的/人类可读的验证消息是完全有意义的。遗憾的是,Java。这不是90年代。