2010-06-08 52 views
2

当我使用unit of work pattern(与JPA)时,我从存储库中获取一个实体,对其进行修改并将修改隐含地保存到数据库中。工作单元模式的验证策略

现在我想知道如何使用工作单元模式进行验证。如果我将更改(从用户输入)应用到域对象并在其后进行验证,则即使验证失败,该对象的值也会更改。避免用数据库写非法状态的对象的方法是什么?回滚工作单元?

面向对象的目标之一是,对象监视自己的状态,以便他们永远不会接受非法值。对于这种方法,我不得不抛出异常,这与上面的bean验证(和spring验证)方法相反。但也许它更简单,更好。

你会使用什么验证策略(在域驱动设计中)?

回答

2

避免将具有非法状态的对象写入数据库的方式是什么?回滚工作单元?

如果使用Bean验证API,它会抛出一个异常和变化不会被持久化(如果启用,验证应该在的PrePersistPreUpdate最后阶段发生,PreRemove生命周期事件) 。

使用JPA 2.0,只需在类路径中添加一个Bean验证实现。

有了JPA 1.0,请参阅this previous answer

+0

要添加到答案,我很确定jpa(或hibernate)有一些非常具体的警告,反对在setter中使用数据验证。 “在返回之前我们如何初始化对象是我们自己的事情,并且可以不止一次地调用setter”。 – 2010-06-08 20:01:50