2010-05-10 68 views
3

我試圖刷新@ManyToMany關係,但這樣做的,而不是清除...JPA @ManyToMany只有一方?

我的項目類看起來是這樣的:

@Entity 
public class Project { 
    ... 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "PROJECT_USER", 
    joinColumns = @JoinColumn(name = "PROJECT_ID", referencedColumnName = "ID"), 
    inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    private Collection<User> users; 
    ... 
} 

但是我沒有 - 我不想 - 用戶實體中的項目集合。

當我看着生成的數據庫表,他們看起來不錯。它們包含所有列和約束(主鍵/外鍵)。

但是,當我堅持一個具有用戶列表的項目(並且用戶仍在數據庫中)時,映射表未得到更新得到更新,但是當我之後刷新項目時,用戶被清除。

爲了更好地理解:

Project project = ...; // new project with users that are available in the db 
System.out.println(project getUsers().size()); // prints 5 
em.persist(project); 
System.out.println(project getUsers().size()); // prints 5 
em.refresh(project); 
System.out.println(project getUsers().size()); // prints 0 

所以,我怎麼能刷新用戶和項目之間的關係?

回答

1

的錯誤似乎是在你離開了代碼...

我假設項目實際上做出來的數據庫(使堅持一個空操作),否則你應該得到一個Hibernate當您嘗試刷新尚未提交的實體時發生異常。

這裏似乎只是對JDBC和ORM與EntityManager實際做的區別有些混淆。 em.persist不是SQL插入或SQL更新。它說'把這個新的實體,並把它放在管理狀態。'通常這最終會導致SQL插入,但這不是在應用程序級別的含義。

看起來你基本上是在講冬眠:「我對此做了一些改變,下次會話同步時請堅持,哦,你知道嗎,我改變了主意,回到了數據庫中的內容。 「 em.persist不會直接在數據庫中放入任何東西,那裏可能還有什麼「沒有」。

嘗試在刷新之前扔一個em.flush,你應該看到你的用戶。

(你還沒說你會是如何配置,或者您是如何管理事務的任何東西,所以我假設這一切都是在一個事務中。)

+0

感謝... em.flush( )做到了! – 2010-05-10 17:59:31

+0

一個人很好奇你試圖實現的功能是什麼?試驗這個是關於ORM如何工作的有趣的學術研究,但我不知道你爲什麼要這樣做。 – Affe 2010-05-10 18:08:44

+0

for UnitTesting ... – 2010-05-11 01:30:39