在JPA中强制方法是非事务性的(Eclipselink)

时间:2010-05-10 18:08:52

标签: jpa transactions eclipselink

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

我不愿意更改Entity对象中的数据,因为即使我没有将方法标记为@Transactional,也存在这样的风险,将来可能会在事务方法中无意中调用此方法这些变化可以坚持下去。

所以我的问题是,无论如何要解决这个问题?如强制方法总是非事务性的;方法启动后立即终止任何事务性;等

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

2 个答案:

答案 0 :(得分:4)

如果是spring,则

@Transactional(propagation=Propagation.NOT_SUPPORTED)
  

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

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


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

答案 1 :(得分:1)

我不确定你的用例是什么,但我不会在这里弄乱交易:

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

      

    在事务中的托管实例或分离的实例中进行的任何更改都将在只读实体类的上下文中生效。