欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EJB3实体一对多关联问题

程序员文章站 2024-02-22 22:22:34
...
重新做起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);
相关标签: SQL Bean