OneToMany/ManyToOne关联

  • @ManyToOne 以及 @OneToMany
//一般选择在多端进行管理,一端放弃,使用级联保存等,即多端添加一个外键列
//Item <-1----------*-> Bid
@Entity
class Item{
    //该集合方便查询,orm的意义.

    // mappedBy表明其放弃管理关联,由多端进行管理

    //cascade表明了级联操作,PERSIST使用时必须建立起Bid到Item的关联,否则将引入无效Bid。
    //Bid bid = new Bid();
    //bid.setItem(item);该语句是必须的!!!否则保存到bid表的bid将没有到item表的外键关联,为一条无效数据。
    //item.bids.add(bid);
    //REMOVE的操作要谨慎,因为REMOVE必须先从数据库中load/get对象,获得其对应的bids,然后逐条删除bid。
    //而使用sql 可以简单实现为一条语句 delete from bid where item_id = :item_id.效率差别大。
    //而且这体现了Bid的生命周期依赖于Item,可以声明Bid为一个组件类,从而优化删除过程

    //orphanRemoval = true,表明当从bids中移除一个bid时,将该bid从数据库中移除,该属性有争议,原因同以上第二条。
    @OneToMany(cascade = {CascadeType.REMOVE,CascadeType.PERSIST},mappedBy = "item",orphanRemoval = true)
    //使bid表在生成外键关联时,使用数据库外键级联,实现数据库级别的级联删除。(外键定义时使用级联策略)
    //其比CascadeType.REMOVE的效率高,但同理最好将Bid声明为一个组件类
    @OnDelete(action = OnDeleteAction.CASCADE)
    //由于其不是管理方,所以实际的结果无序。
    private List<Bid> bids;

}

@Entity
class Bid{
    //用于指定外键列的名称
    @JoinColumn(name = "item_id")
    //获取策略默认为EAGER
    @ManyToOne(fetch = FetchType.LAZY)
    private Item item;
}

posted @ 2016-04-12 23:29  fcat  阅读(329)  评论(0编辑  收藏  举报