重新做起EJB3的实体bean,觉得最难的还是一对多的关联问题,
1.[b]单向一对多关系[/b] 即使用OneToMany(),在自动建表时除了两张实体表,还会建一张关联表,但一般的一对多关联其实是不需要关联表的
2.[b]双向一对多关系[/b] 即使用了OneToMany和ManyToOne(mappedName="name")时,自动建表不会多建关联表,似乎更符合我们的需求
3 [b]删除双向一对多关系[/b] 以相册和照片的一对多关系为例。
4.[b]单向一对多关系[/b] 我觉得比较麻烦,如果album还在persistence context中的话,可能要先找出Album对象,删除他们的关联,否则下次查询也会出现类似同步的问题。
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);