java - 在 Seam 中手动回滚事务

标签 java hibernate transactions seam rollback

这是一个与Forcing a transaction to rollback on validation error 类似的问题 场景是这样的: 用户编辑页面,事务设置为 MANUAL,因此只有当我们调用 flush 时,它才会提交到数据库。现在用户想要取消更改。很简单,因为您还没有冲洗它。

现在考虑这个场景:用户编辑带有大量 ajax 的页面。其中一些 ajax 回调需要数据库查询(例如使用 richFaces 建议框等)。还完成了一些需要数据库查找的验证。问题是 Hibernate 会在您进行查询时自动发出刷新。所以用户没有按下保存按钮(这会刷新交易)他按下了取消按钮。你现在做什么?

如果您什么都不做,更改将写入数据库 - 这不是用户所期望的。

你可以抛出一个用

注释的异常
@ApplicationException(rollback=true)

这将回滚事务。然后您可以重定向到另一个页面。但是在这里我遇到了另一个问题,在某些页面上你重定向到你得到一个延迟初始化异常。我已经指定了

<exception class="com.mycomp.BookingCancelException">
    <end-conversation before-redirect="true"/>  
    <redirect view-id="/secure/Bookings.xhtml">
        <message severity="INFO">#{messages['cancel.rollback']}</message>
    </redirect>
</exception>

在 pages.xml 中,因此对话应该在我们进行重定向之前结束。一个新的对话应该开始(通过一个新的交易)但是这似乎并不是在所有情况下都会发生?为什么?

我在其他地方读过,你可以简单地使用

Transaction.instance().rollback();

这会更好,因为您不必通过异常(当 Seam 处理异常时,重定向总是需要很长时间),但问题是事务实际上并没有回滚。我不知道为什么。如果我检查事务的状态,它会说它不在回滚状态。

您如何最好地处理取消请求。纯手动冲洗在这种情况下不起作用。您可以使用分离的实体,但该页面包含多个链接的实体,因此这会变得困惑。

更新:我现在发现抛出 ApplicationException 不会在所有情况下回滚事务。现在很困惑。

更新 2:当然,当您有一个使用 ajax 更新值的页面时,回滚事务将不起作用。每笔交易只涉及一个请求。所以如果你这样做使用 ajax 请求进行 5 次编辑,回滚事务将只回滚最后一个 ajax 请求的更改,而不是前面 4 个请求的更改。

所以解决方案实际上是使用手动刷新模式。

即使您指定 MANUAL,也有一些情况会导致刷新。

  • ajax 请求中的查询可以触发刷新 - 在查询上使用 setFlushMode(FlushMode.COMMIT) 可以避免这种情况。
  • 根据使用的 ID 生成(例如,如果您使用 IDENTITY 策略),持久化实体可以触发刷新。您可以使用 Cascades 解决此问题。如果您需要在编辑期间创建与您正在编辑的主要实体没有任何实际关系的实体,只需将它们添加到列表中,并在保存时将所有实体保留在该列表中。
  • 当您开始嵌套对话或另一个 bean 加入对话时,如果您未指定 @Begin(join=true,flushMode=FlushModeType.MANUAL),该 session 上的刷新模式将设置回自动

您可能希望在 components.xml 中将 MANUAL 指定为默认模式

<core:manager concurrent-request-timeout="10000"
  conversation-id-parameter="cid" conversation-timeout="600000" default-flush-mode="MANUAL"/>

最佳答案

你试过吗

@Begin(flushMode=MANUAL)
someRandomValidationMethodHere(){ ... }

或设置

<core:manager conversation-timeout="120000" default-flush-mode="manual" />

在 components.xml 中?

关于java - 在 Seam 中手动回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9599644/

相关文章:

java - Collections.sort() 有效,但 Collections.reverseOrder() 中断

java - "Could not write JSON: failed to lazily initialize a collection of role"带 springboot 和 hibernate 搜索

php - 如何在 PHP 中管理嵌套数据库事务?

python - NDB 交易中的错误?

java - LibGDX Bullet 扩展的 ContactListener 如何工作?

Java如何检查值是否已经AES加密;

java - 了解 Hibernate 获取

hibernate 搜索: spatial+less than condition

java - JPA/Hibernate 问题(@PrePersist,Session API 说明)

mysql - SQL中的范围锁可以共享模式获取吗