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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值