代码之家  ›  专栏  ›  技术社区  ›  rhinds

在JPA中强制方法为非事务性(EclipseLink)

  •  2
  • rhinds  · 技术社区  · 15 年前

    我正在使用EclipseLink开发一个应用程序,作为应用程序的一部分,我需要能够操作一些涉及更改数据的对象,而不必将其持久化到数据库中(我为某些批处理生成过程合并/更改对象)。

    我不愿意更改实体对象中的数据,因为即使我没有将方法标记为 @Transactional ,该方法将来可能会在事务性方法中被不适当地调用,并且这些更改可以被持久化。

    所以我的问题是,有没有办法解决这个问题?例如强制一个方法始终是非事务性的,不管它是什么;一旦该方法启动,立即终止任何事务性;等等。

    我知道有一个.detach()方法可以从实体管理器中分离对象,但是,有许多对象,这在我的代码中似乎是一个潜在的容易出错的防故障方法。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Bozho    15 年前

    如果这是 spring 你有

    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    

    非事务性执行,如果存在当前事务,则挂起当前事务。类似于同名的EJB事务属性。

    如果它是EJB,则具有相同名称的事务属性。


    不管怎样,您可以简单地克隆对象并修改所需的数据,而不是玩弄事务。深度克隆可以通过commons lang实现。 SerializationUtils .

        2
  •  1
  •   Pascal Thivent    15 年前

    我不确定是否理解您的用例,但我不会在这里和下面的任何一个地方处理事务:

    • 不是 merge 对实体所做的更改~或~
    • refresh 之前对实体所做的任何更改 合并 (但是你为什么要打电话 合并 ?)~或
    • 处理实体的非管理副本~或~
    • 声明某些类是只读的(EclipseLink特定的,请参见 Declaring Read-Only Classes How to Use the @ReadOnly Annotation )来自DOC:

      在事务中的托管实例中所做的任何更改,或对分离的实例和合并的实例所做的任何更改,在只读实体类的上下文中都将不起作用。