2013-11-01 18 views
0

我正在使用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(); 
} 

我先創建一個實體EventPresenceTaskTask子類的兩個任務,並持續他們。稍後,我查詢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()放在關閉鉤子中是非常安全的,但它沒有幫助。

更新:要明確正在堅持什麼,以及相關的是HITTask其本身的實體子類的實例。

+0

爲什麼你有'@ManyToMany(targetEntity = BBNHIT.class)'而不是簡單的'@ ManyToMany'或'@ManyToMany(targetEntity = HIT.class)'? –

+0

@JBNizet:對不起,這是一個錯字。它應該只是'HIT.class'。我已經更新了這個問題。如果我刪除了'targetEntity'屬性,那麼在EclipseLink代碼中,數據庫創建會崩潰並帶有'NullPointerException'。我認爲這可能是由於'HIT'是一個泛型類,但我不確定。 –

+0

打開eclipselink日誌記錄以查看在訪問任務集合時用於讀取HIT和相關任務的SQL http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging – Chris

回答

0

愚蠢的錯誤 - 我忘記了在HIT類上註解繼承策略。在我這樣做後,數據庫創建崩潰,例外。但是,切換到JOINED這兩個類作品的繼承策略。

相關問題