我正在使用JPA作爲EclipseLink和Apache Derby的應用程序。我有一個@ManyToMany關係的兩個實體:JPA @ManyToMany關係僅在數據庫重新加載時保存在一側
@Entity
class HIT<TaskType> {
...
@ManyToMany(targetEntity=Task.class, mappedBy="hits")
protected List<TaskType> tasks = Lists.newArrayList();
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
abstract class Task {
...
@ManyToMany(targetEntity=HIT.class)
protected List<HIT<?>> hits = Lists.newArrayList();
}
我先創建一個實體EventPresenceTask
的Task
子類的兩個任務,並持續他們。稍後,我查詢EntityManager以恢復這些任務並使用它們創建EventPresenceHIT
的實例,HIT
的子類型。創建HIT時,它將兩個任務都添加到其tasks
列表中,並將其自身添加到每個任務的hits
列表中。然後堅持下去。
創建對象後,我首先查詢EntityManager
所有HIT
S和打印它們,然後查詢EntityManager
所有Task
S和打印這些檢查一切。我得到:
EventPresenceHIT{... #tasks=2}
EventPresenceTask{... # hits=1}
EventPresenceTask{... # hits=1}
與預期的一樣。但是,如果我關閉應用程序並重新裝載數據庫,我得到:
EventPresenceHIT{... #tasks=0}
EventPresenceTask{... #hits=1}
EventPresenceTask{... #hits=1}
既然一切似乎是在程序的初始運行新的查詢到EntityManager
正確的,我很擔心EntityManger
不刷新到數據庫(因爲程序被Ctrl-C終止),所以我把entityManager.close()
放在關閉鉤子中是非常安全的,但它沒有幫助。
更新:要明確正在堅持什麼,以及相關的是HIT
和Task
其本身的實體子類的實例。
爲什麼你有'@ManyToMany(targetEntity = BBNHIT.class)'而不是簡單的'@ ManyToMany'或'@ManyToMany(targetEntity = HIT.class)'? –
@JBNizet:對不起,這是一個錯字。它應該只是'HIT.class'。我已經更新了這個問題。如果我刪除了'targetEntity'屬性,那麼在EclipseLink代碼中,數據庫創建會崩潰並帶有'NullPointerException'。我認爲這可能是由於'HIT'是一個泛型類,但我不確定。 –
打開eclipselink日誌記錄以查看在訪問任務集合時用於讀取HIT和相關任務的SQL http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging – Chris