使用ExtendedPersistenceContext和ApplicationException时出现问题

时间:2011-06-22 08:53:31

标签: exception-handling transactions ejb seam

我正在尝试使用ExtendedPersistenceContext来使用EJB 3和Seam实现分离的对象模式。

我还有一个业务规则引擎,当我根据数据库中的数据合并时处理我的对象。

当业务规则出现问题时,应用会启动标有

的异常
  

@ApplicationException(rollback = true)

不幸的是,根据EJB特定和来自SO Forcing a transaction to rollback on validation errors in Seam的这个问题,注释会强制所有对象分离。

所以基本上我的对象处于与之前相同的状态(它包含用户进行的修改)但是它无法使用ExtendedPersistenceContext解析它的关系,因为它处于Detached状态。

这打破了我的所有页面,因为即使在业务引擎失败后我也想要解析AJAX调用。

我无法再次合并对象,否则修改将在数据库上传播,如果存在ApplicationException,我不想这样做。

如果业务验证失败,我想回滚事务,但我希望我的对象仍然处于持久状态,以便它可以使用扩展的持久化上下文来解析它的关系。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

分离单个对象可以使用entityManager.detach(object),否则可以使用entityManager.clear()分离EntityManager的所有基础对象。

您可以克隆对象以维持正在进行的更改。防止他们回滚异常。这些更改将在克隆对象上进行。然后在持久化之前将它们应用于托管对象。

如果对象已分离,则必须执行entityManager.refresh(object)才能对其进行管理&然后相应地应用克隆对象的变化。