实体关系映射
一对一关联:1、主键关联 从表的主键同时是主表的外键,从表没有单独外键
2、外键关联 从表中存在外键列,关联主表的外键列。但外键列是不重复的。
级联操作(all,none,delete,save-update)当前对象执行某操作的情况下, 有关联的对象也执行cascade设置的相同操作
cascade和inverse的区别
cascade表示级联操作,当主表记录做操作时,从表记录做相应的操作,维护的是记录。
inverse表示控制反转,当该属性设置为true,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。一般来说,inverse设置在一方,外键由从表维护。
一对一:
<!-- name为属性名,class为该属性的类型,cascade表示当对主表对象操作时,从表对象是否做级联操作 -->
<one-to-one name="codeBean" class="com.joker.bean.CodeBean"cascade="all"></one-to-one>
<!-- constrained表示该主键存在外键约束,lazy=false表示取消延迟加载,查询该对象时,关联对象立即查询 -->
<one-to-one name="manBean" class="com.joker.bean.ManBean"constrained="true" lazy="false"></one-to-one>
一对一的从表主键如何配置:<id name="id" column="id">
<!-- 主键生成策略,foreign镖师该主键同时也是外键 -->
<generatorclass="foreign">
<!-- manBean为属性名,表示该主键ManBean对象的主键生成 -->
<paramname="property">manBean</param>
</generator>
</id>
<!-- 主表:配置一对多,指定集合存放元素的类型 -->
<setname="prodSet" inverse="true">
<keycolumn="factoryId"></key>
<one-to-many class="com.lovo.RoomBean" />
</set>
<!--从表: 配置多对一,指定集合存放元素的类型 -->
<many-to-onename="user" class="com.lovo.bean.UserBean"
column="userId"lazy="false"></many-to-one>
多对多关系映射:
<!-- talbe为中间表表名 -->
<setname="gradeSet" table="t_role_grade">
<!-- 当前对象对应中间表的外键列名 -->
<keycolumn="roleId"></key>
<many-to-manyclass="com.lovo.bean.GradeBean"
column="gradeId"/>
</set>
注解注册:
一对一
@OneToOne(mappedBy="manBean",cascade=CascadeType.ALL) |
mappedBy表示当前属性映射的从表对象的关联属性名,cascade表示是否做级联删除 |
@JoinColumn(name="manId",unique=true) |
name为外键列名,unique表示唯一外键关联 |
一对多
@OneToMany(targetEntity=RoomBean.class) |
targetentity指定集合中存放元素类型 |
@JoinColumn(name="userId") |
指定外键列名 |
多对一
@ManyToOne(fetch=FetchType.EAGER) |
fetch=FetchType.EAGER表示立即加载,查询从表记录时立即查询主表对象 |
@JoinColumn(name="userId") |
指定外键列名 |
@ManyToMany(targetEntity=GradeBean.class) |
|
@JoinTable(name="t_role_grade",joinColumns={@JoinColumn(name="roleId")}, inverseJoinColumns={@JoinColumn(name="gradeId")}) |
指定中间表的表名,当前对象对应中间表的外键列名,集合中存放元素对应中间爱表的外键列名 |