【问题标题】:Forcing a method to be non-transactional in JPA (Eclipselink)在 JPA (Eclipselink) 中强制方法为非事务性方法
【发布时间】:2011-02-17 19:27:42
【问题描述】:

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

我不愿意更改 Entity 对象中的数据,因为即使我没有将方法标记为 @Transactional,也有可能在将来无意中从事务方法中调用此方法,而这些更改可以持久化。

所以我的问题是,有没有办法解决这个问题?例如强制方法始终是非事务性的;方法一启动就终止任何事务性;等等

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

【问题讨论】:

  • 标记spring或ejb

标签: jpa transactions eclipselink


【解决方案1】:

如果这是spring,你有

@Transactional(propagation=Propagation.NOT_SUPPORTED)

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

如果是 EJB,你有一个同名的事务属性。


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

【讨论】:

    【解决方案2】:

    我不确定是否理解您的用例,但我不会在这里和事务搞混:

    • 不是merge 对实体所做的更改~or~
    • refreshmerge 之前对实体所做的任何更改(但你为什么要调用merge?)~or~
    • 处理实体的非托管副本〜或〜
    • 声明一些类是只读的(EclipseLink 特定,请参阅Declaring Read-Only ClassesHow to Use the @ReadOnly Annotation)。来自文档:

      在事务中的托管实例内或对分离实例所做的任何更改并合并将不会在只读实体类的上下文中产生影响。

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2011-05-19
      • 1970-01-01
      • 2018-06-01
      • 2015-09-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多