- @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;
}