我有一个 POJO 叫Order
如下:
public class Order {
@Id
@GeneratedValue
@Column(name="id")
protected int id;
@NotNull
@Future
protected Date desiredProcessingDate;
protected Date actualProcessingDate;
}
正如您所看到的,必须指定desiredProcessingDate,并且它必须是将来的日期。用户将通过表单提交新订单并指定desiredProcessingDate
,正在按预期进行验证。然后订单通过以下方式保存到数据库中sessionFactory.getCurrentSession().persist(order);
稍后,预定的服务将从数据库中检索订单,对其进行处理并标记actualProcessingDate
与当前时间戳。
但是,当该服务调用时sessionFactory.getCurrentSession().merge(order);
验证再次启动并失败,因为desiredProcessingDate
现在已经成为过去。
看来我需要做的就是告诉merge(order)
操作不进行验证,但我不确定如何执行此操作。
如果这是不可能的,那么似乎唯一的解决办法就是编写一个类级自定义验证器,它只检查desiredProcessingDate
是在未来如果actualProcessingDate == null
,对于看似简单的需求来说,这似乎过于复杂。任何指示将不胜感激。
JPA 中的验证行为可以使用属性进行配置javax.persistence.validation.group.pre-persist
, javax.persistence.validation.group.pre-update
and javax.persistence.validation.group.pre-remove
。这些属性的值是一个逗号分隔的验证组的完全限定类名列表,用于每个给定的 JPA 生命周期事件,例如:
<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default,com.acme.PrePersist"/>
<property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default"/>
作为解决你的问题的方法是添加@Future
对“PrePersist”组的约束,在这种情况下,它仅在持久时验证,而不在更新时验证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)