一对多|多对一操作
orm操作
r 确定表之间的关系
例如客户和联系人 customer 1 linkman *
o 对象,创建实体对象
Customer类,提供无参构造,和属性(get/set方法)
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
//添加对应多表实体set集合
private Set<LinkMan> linkmen=new HashSet<>();
LinkMan类
private Long lkm_id;
private String lkm_name;
private Character lkm_gender;
private String lkm_phone;
private String lkm_mobile;
private String lkm_email;
private String lkm_memo;
//添加对应的Customer对象
private Customer customer;
m 配置映射关系
Customer.hbm.xml
<set name="linkmen">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
LinkMan.hbm.xml
<!--配置多对一-->
<many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>
castcade属性:级联操作
- save-update:级联保存
- delete:级联删除
all: 级联保存+级联删除
不建议使用inverse属性:是否放弃维护关系
- false默认值
- true 放弃维护关系
只有一的一方能放弃维护关系.通常情况下,一的一方都是需要放弃维护关系的.如果放弃了维护关系,我们要通过多的一方表达关系
<set name="linkmen" inverse="true" cascade="delete" lazy="extra">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
<many-to-one name="customer" class="Customer" column="lkm_cust_id" cascade="delete"></many-to-one>
移除关系
//获取联系人
LinkMan linkMan = session.get(LinkMan.class, 1L);
//设置客户
linkMan.setCustomer(null);
添加关系
//获取联系人
LinkMan linkMan = session.get(LinkMan.class, 1L);
//获取客户
Customer c = session.get(Customer.class, 5L);
//设置客户
linkMan.setCustomer(c);
多对多操作
- R 关系数据库 例如 用户表 user 角色表role 多对多的关系
多对对关系用中间表表达,中间表分别引用两张表的主键 - O 对象
User类
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
//多对多
private Set<Role> roles=new HashSet<>();
Role类
private Long role_id;
private String role_name;
private String role_memo;
//多对多
private Set<User> users=new HashSet<>();
- M 映射配置
– User.hbm.xml
<set name="roles" table="sys_user_role" cascade="delete">
<key column="user_id"></key>
<many-to-many column="role_id" class="Role"/>
</set>
– Role.hbm.xml
<set name="users" table="sys_user_role" inverse="true">
<key column="role_id"></key>
<many-to-many column="user_id" class="User"/>
</set>
为了避免关系维护重复,导致出现异常.一般情况下都会在多对多关系中选择一方放弃维护关系.哪一方放弃需要看业务逻辑.
用户|角色 : 录入用户时指定角色,用户维护角色放弃.
订单|商品: 录入订单时指定购买了那些商品.订单维护,商品放弃.
老师|学生:学生入学指定由哪个老师教,学生维护.老师放弃
多对多移除关系
//获得用户
User u = session.get(User.class, 9L);
//获得角色
Role r = session.get(Role.class, 10L);
u.getRoles().remove(r);
多对多添加关系
//获得用户
User u = session.get(User.class, 4L);
//获得角色
Role r = session.get(Role.class, 9L);
u.getRoles().add(r);
对象关系导航查询
- 根据客户找联系人
//获得客户
Customer c = session.get(Customer.class, 5l);
//获取联系人
Set<LinkMan> linkmen = c.getLinkmen();
System.out.println(c);
System.out.println(linkmen);
- 根据联系人查找客户
LinkMan linkMan = session.get(LinkMan.class, 1l);
//获得客户
Customer c = linkMan.getCustomer();
System.out.println(linkMan);
System.out.println(c);
关联级别懒加载
- 一对多/多对多
- 多对一懒加载
所有懒加载使用默认值即可.