2014-09-02 100 views
0

我一直在試圖解決這個問題一段時間,但我似乎無法找到任何有類似問題的人。Play Framework 2.1.x CascadeType.DETACH

我有一個人,其中包含多個LogEntries。當我刪除該人時,我仍然希望保持日誌條目不變。

在Person.java:

@OneToMany(mappedBy = "person", cascade = CascadeType.DETACH) 
private List<LogEntry> logEntries; 

在LogEntry.java:

@ManyToOne(cascade = CascadeType.DETACH) 
@JsonIgnore 
private Person person; 

它甚至有可能做到這一點?我得到一個抱怨錯誤,抱怨外鍵,這是可以理解的,因爲不再有任何關係。但我想知道它是否有可能?

TL;博士

我想刪除的人,但保留日誌條目,但得到持久性的錯誤。

任何幫助表示讚賞。

回答

1

我認爲你是在一個錯誤:

ObjectDB JPA help

獨立的實體對象是在一個特殊的狀態對象中,他們 不由任何EntityManager的管理,但在 仍表示對象數據庫。

...

...

標記與CascadeType.DETACH(或CascadeType.ALL,其包括DETACH)的參考字段指示分離操作應自動級聯到被引用的實體對象通過那場

所以,分離是從實體管理器卸載對象。如果你想deatch(刪除鏈接)一個人從它的登錄條目你必須手工。

要做到這一點,您可以使用JPQL Update Query刪除之前元素。舉例(警告,未經測試!):

Query query = em.createQuery(
    "UPDATE LogEntry log SET log.person = null where log.person = :person"); 
query.setParameter("person", person); 
int updateCount = query.executeUpdate(); 
em.remove(person); 

注意

  • 使用此代碼交易代碼裏面
  • 更新查詢不notificate 更新事件JPA聽衆(如@PrePersist@PostPersist註解的方法)
  • 作爲is described here你不應該使用JPA聽衆對EntityManager的進行任何操作,所以你不應該使用@PreRemove實體清除LogEntity關係。
+0

謝謝!你在各個方面都回答了我的問題,如果可以的話,我會回覆你的問題,並會盡我所能確保回來。 – 2014-09-02 09:42:51

+0

不客氣;-) – jmvivo 2014-09-02 10:36:14