EJB3实体一对多关联问题

重新做起EJB3的实体bean,觉得最难的还是一对多的关联问题,

1. 单向一对多关系 即使用OneToMany(),在自动建表时除了两张实体表,还会建一张关联表,但一般的一对多关联其实是不需要关联表的
2. 双向一对多关系 即使用了OneToMany和ManyToOne(mappedName="name")时,自动建表不会多建关联表,似乎更符合我们的需求
3 删除双向一对多关系 以相册和照片的一对多关系为例。
Photo photo = em.find(Photo.class, photoID);
        //判断album是否在持久环境中,如果是,则删除他们的关联关系,
         //否则在接下来的查询中,可能还会查出删除的相片...
        album = photo.getAlbum(); 
        if(em.contains(album)){
            album.getPhotos().remove(photo);
        }
  //这是删除Photo的记录,但也并不是马上会更新数据库
  em.remove(photo);


4. 单向一对多关系 我觉得比较麻烦,如果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)