Entity Bean (3) : 一对多关系[转]
知识点1:cascade和inverse有什么区别?
1、说白了inverse是维护两对象的关联关系的,只涉及到“桥字段”,不会考虑或改变其他的字段。
而cascade是专门级联维护对方实体内容的。
· 比如:
将集合对象置为null, (null);
inverse导致hibernate执行:udpate STUDENT set SCHOOL_ID=null where SCHOOL_ID=?
cascade则不会执行对STUDENT表的关联更新, 因为集合中没有元素。
· “set的inverse属性决定是否把对set的改动反映到数据库中去。
· inverse=false————反映;inverse=true————不反映”
·
· 2、inverse与cascade没有什么关系,互无牵扯。
· commit后,这两个属性发挥作用的时机不同,hibernate会根据对pojo对象的改动,及cascade属性的设置,生成一系列的Action,比如UpdateAction,DeleteAction,InsertAction等,每个Action都有execute方法以执行对应的sql语句。待所有这些Action都生成好了后,hibernate再一起执行它们,在执行sql前,inverse属性起作用,当inverse=true时,不执行sql;当inverse=false时,执行sql。
3、inverse属性默认为false
知识点2:双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)。在关系被维护端需要通过***@JoinColumn建立外键列指向关系维护端的主键列。其中默认inverse=false ,而mapedBy="xxxx"相当于inverse=true。
lass Order implements Serializable {
privateSet<OrderItem> orderItems = new HashSet<OrderItem>();
。。。。
***@OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义***@joincolumn),cascade = , fetch = )
***@OrderBy(value = "id ASC")
public Set<OrderItem> getOrderItems() {
returnorderItems;
}
}
lass OrderItem implements Serializable {
private Order order;
。。。。
***@ManyToOne(cascade=,optional=false)
***@JoinColumn(name = "order_id")
public Order getOrder() {
returnorder;
}
}
***@OrderBy(value = "id ASC") 指明加载OrderItem 时按id 的升序排序
***@OneToMany的属性:
1>targetEntity
定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
2>mappedBy
定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。
该属性的值是“多”方class里的“一”方的变量名
3>cascade
该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order时将同时删除它所对应的OrderItem对象。而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。
(级联新建)、(级联删除)、(级联刷新)、(级联更新)中选择一个
hibernateannotation学习笔记 来自淘豆网m.daumloan.com转载请标明出处.