关联关系
1.关联关系中常用属性
1.1 cascade属性
关于cascade(级联)属性
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
Cascade取值:
None,save-update,delete和all
none:当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值.
Save-update:当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。
Delete:当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
All:包含save-update,delete的行为。
注意点:级联也就是说当我们保存持久化对象A的时候自动帮我们保存持久化对象B。
Eg.测试代码的核心部分
tx= session.beginTransaction();
//准备一个Department对象
Dept dept=new Dept();
dept.setDeptname("软件部");
//准备一个Employee对象
Emp emp=new Emp();
emp.setEmpname("陈文杰");
emp.setDept(dept);
dept.getEmps().add(emp);
session.save(dept);
tx.commit();
关联标记属性
简单介绍下面几个,除了name是必须,其余都是可选的。更多的我们参考官文档。
name="对应本类的属性名"
column="映射到本表的字段名"
class="映射到本表的实体类"
unique="ture|false":(数据库外键字段生成一个唯一约束)
not-null="ture|false"默认false(数据库外键字段是否允许为空值)
lazy="ture|false"默认proxy(延迟加载)
1.2 inverse属性
inverse属性指定了关联关系中的方向。
inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false 。
注意:inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因 为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
Eg.测试代码如下:
tran = session.beginTransaction();
//准备一个Department对象
Department dept=new Department();
dept.setName("财务部");
//准备一个Employee对象
Employee emp=new Employee();
emp.setName("陈文杰");
//员工指定自己所属的部分
emp.setDept(dept);
dept.getEmployees().add(emp);
session.save(dept);
// 事务提交
tran.commit();
System.out.println("成功");
说明:如果我既给员工指定了自己所属的部门,又将员工添加到部门集合中。那么这个时候reverse不设置,生成以下sql
inverse设置为true,不负责维护关联关系
一对多类图举例:
映射文件
dept.hbm.xml中做映射:
加一个集合set标签,name指的是在Dept中植入的set集合起的名字,column指的是多的一方表的外键列,class指的是创建关联关系的类名