EJB3實體一對多關聯問題

重新做起EJB3的實體bean,覺得最難的還是一對多的關聯問題,

1.[b]單向一對多關係[/b] 即使用OneToMany(),在自動建表時除了兩張實體表,還會建一張關聯表,但一般的一對多關聯其實是不需要關聯表的
2.[b]雙向一對多關係[/b] 即使用了OneToMany和ManyToOne(mappedName="name")時,自動建表不會多建關聯表,似乎更符合我們的需求
3 [b]刪除雙向一對多關係[/b] 以相冊和照片的一對多關係爲例。
Photo photo = em.find(Photo.class, photoID);
//判斷album是否在持久環境中,如果是,則刪除他們的關聯關係,
//否則在接下來的查詢中,可能還會查出刪除的相片...
album = photo.getAlbum();
if(em.contains(album)){
album.getPhotos().remove(photo);
}
//這是刪除Photo的記錄,但也並不是馬上會更新數據庫
em.remove(photo);


4.[b]單向一對多關係[/b] 我覺得比較麻煩,如果album還在persistence context中的話,可能要先找出Album對象,刪除他們的關聯,否則下次查詢也會出現類似同步的問題。

//如果只是這樣,如果這個photo的album還在persistence context 中,
//那em.find(Album.class,albumID)會不能同步。
Photo photo = em.find(Photo.class,photoID);
em.remove(photo);



//使用find()方法,即使fetch設爲EAGER,也不會獲取相冊下的photos,
//Album album = em.find(Album.class,albumID);

//如果fetch不設爲EAGER,那麼下面的sql 還需加上LEFT JOIN FETCH a.photos
String sql = "SELECT a FROM Album a WHERE a.id = "+albumID;
query = em.createQuery(sql);
Album album = (Album)query.getSingleResult();
album.getPhotos().remove(photo);
Photo photo = em.find(Photo.class,photoID);
em.remove(photo);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章