2010-05-10 58 views
2

我正在開發一個使用Eclipselink的應用程序,並且作爲應用程序的一部分,我需要能夠操作某些涉及更改數據的對象,而不會將其保留到數據庫(我爲某些批生成過程合併/更改對象)。在JPA(Eclipselink)中強制使用非事務性方法

我不願意更改實體對象中的數據,因爲即使我沒有將方法標記爲@Transactional,這種方法在未來可能會在事務性方法中被無意調用,並且這些更改可以堅持下去。

所以我的問題是,有沒有辦法解決這個問題?如強制一種方法永遠是非事務性的;方法一開始就立即終止任何事務;等等

我知道有一個.detach()方法,可以從實體管理器分離對象,但是,有很多對象,這似乎是一個潛在的錯誤在我的代碼失敗安全。

+0

tag spring或ejb – Bozho 2010-05-10 21:01:15

回答

4

如果這是spring,你有

@Transactional(propagation=Propagation.NOT_SUPPORTED) 

執行非事務,如果存在暫停當前事務。類似於同名的EJB事務屬性。

如果是EJB,則具有相同名稱的事務屬性。


無論如何,不​​要玩弄交易,你可以簡單地克隆你的對象並修改所需的數據。深層克隆可以通過commons-lang SerializationUtils來實現。

1

我不知道,瞭解你的使用情況,但我不會亂用交易在這裏,要麼:〜到實體提出

  • merge變化或〜
  • refresh任何更改實體提出前merge(但你爲什麼要叫merge?)〜或〜
  • 對實體的非託管副本〜或〜工作
  • 聲明一些類是隻讀的(E clipseLink特定,請參閱Declaring Read-Only ClassesHow to Use the @ReadOnly Annotation)。來自文檔:

    在事務中的託管實例或分離實例中進行的任何更改以及合併都不會影響只讀實體類的上下文。