Spring 如何验证某些持久性操作,而不是其他操作
我有一个要求,即用户可以在根本没有验证的情况下“保存”一个Spring 如何验证某些持久性操作,而不是其他操作,spring,validation,jpa,spring-boot,Spring,Validation,Jpa,Spring Boot,我有一个要求,即用户可以在根本没有验证的情况下“保存”一个foo,但如果他们“提交”,则必须验证对象。我已经用Parsley.js构建了所有这些,并在前端工作,但我想添加后端验证 使用Spring/Boot执行此操作的典型方法是什么?我理解基本的JPA验证,但我不知道如何有条件地应用它 我还想提到,我曾尝试使用Foo的两个子类来实现这一点,但我无法管理切换类型,这可能是因为在Java中不可能实现,也可能是因为我不理解如何实例化对象的新版本,并期望它.equals()作为Hibernate持久化的
foo
,但如果他们“提交”,则必须验证对象。我已经用Parsley.js构建了所有这些,并在前端工作,但我想添加后端验证
使用Spring/Boot执行此操作的典型方法是什么?我理解基本的JPA验证,但我不知道如何有条件地应用它
我还想提到,我曾尝试使用Foo
的两个子类来实现这一点,但我无法管理切换类型,这可能是因为在Java中不可能实现,也可能是因为我不理解如何实例化对象的新版本,并期望它.equals()
作为Hibernate持久化的旧版本
感谢您的帮助。JPA不可能进行条件验证 为什么??因为许多验证只是数据库约束,JPA不会验证,但数据库会无条件地验证 例如a
@NotNull
private Integer value;
将创建一个具有非空
约束的列
或者
将创建一列VARCHAR(100)
正如您可能理解的那样,不可能将值保存到这样一个列中,该列会打破大小限制,并且包含100个以上的字符
事实上,在Java中切换对象的类型是不可能的
例如,您可以将Entity1
强制转换为Entity2
,但这只是编译器的变量。对象本身是一个实体1
——无论您尝试什么。但您可以将所有值从Entity1
的实例复制到Entity2
的新实例:
Entity1 entity1 = ...
Entity2 entity2 = new Entity2();
entity2.setProperty(entity1.getProperty());
...
entityManager.persist(entity2);
entityManager.delete(entity1);
如果不想手动复制所有属性,可以使用BeanUtils.copyProperties
from
您需要更清楚地了解您的术语,也许可以提供一些伪代码来演示您想要的内容。复制您所描述的属性是否允许对实体持久性进行充分的.equals()比较?也就是说,假设我配对了.equals()方法,只比较attr值,而不是Id/timestamp,我忘记了bean验证——所以我想说Neil McGuigans的答案比我的好——最好尝试使用这个方法。非常好的建议。您能建议我如何编写单元测试以确保我的控制器拒绝记录吗?
Entity1 entity1 = ...
Entity2 entity2 = new Entity2();
entity2.setProperty(entity1.getProperty());
...
entityManager.persist(entity2);
entityManager.delete(entity1);