2

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

我不愿意更改 Entity 对象中的数据,因为即使我没有将方法标记为@Transactional,也可能会在将来无意中从事务方法中调用此方法,并且这些更改可能会保留下来。

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

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

4

2 回答 2

4

如果这是春天,你有

@Transactional(propagation=Propagation.NOT_SUPPORTED)

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

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


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

于 2010-05-10T20:55:45.503 回答
1

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

  • 没有merge对实体进行更改〜或〜
  • refresh之前对实体所做的任何更改merge(但你为什么要打电话merge?)〜或〜
  • 处理实体的非托管副本〜或〜
  • 声明一些类是只读的(特定于 EclipseLink,请参阅声明只读类如何使用 @ReadOnly 注释)。从文档:

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

于 2010-05-11T07:08:59.777 回答