一对多的关联关系映射并操作
表与表的三种关系建表原则
-
一对多 :在多的一方创建外键指向一的一方的主键
-
多对多 :创建一个中间表,中间表中至少两个字段作为外键分别指向多对多双方的主键
-
多对一 :略
-
创建客户实体
-
创建联系人实体
-
创建映射
package per.chuan.domain;
import java.util.HashSet;
import java.util.Set;
public class Customer {
/*
* CREATE TABLE `cst_customer` (
`cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` VARCHAR(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` VARCHAR(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*/
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
//一个客户有多个联系人:客户中应该放入有联系人的集合。
private Set<LinkMan> linkMens = new HashSet<LinkMan>();
public void setLinkMens(Set<LinkMan> linkMens) {
this.linkMens = linkMens;
}
public Set<LinkMan> getLinkMens() {
return linkMens;
}
<省略......>
package per.chuan.domain;
public class LinkMan {
private Long lkm_id;
private Character lkm_gender;
private String lkm_name;
private String lkm_phone;
private String lkm_mobile;
private String lkm_email;
private String lkm_qq;
private String lkm_position;
private String lkm_memo;
//表达多对一关系
private Customer customer;
// `lkm_cust_id` bigint(32) NOT NULL COMMENT 外键字段
public Customer getCustomer() {
return customer;
}
<省略...>
}
完成Customer和LinkMan表的基本配置后,在Customer.hbm.xml中配置:
(事先配置了包名,后续不再配置全类名)
<!--
name属性:集合属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<set name="linkMens" >
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan" />
</set>
在Linkman.hbm.xml中配置
<!--
name属性:引用属性名
column属性: 外键列名
class属性: 与我关联的对象完整类名
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
测试代码:
@Test
public void fun1(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
// //操作
Customer c = new Customer();
c.setCust_name("江总");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("秘书小李");
LinkMan lm2 =new LinkMan();
lm2.setLkm_name("秘书小张");
c.getLinkMens().add(lm1);
c.getLinkMens().add(lm2);
session.save(lm1);
session.save(lm2);
session.save(c);
//提交事务
tx.commit();
session.close();
}
执行代码,成功关联两张表:
<!--
级联操作: cascade
save-update: 级联保存更新
delete:级联删除
all:save-update+delete
级联操作: 简化操作.目的就是为了少些两行代码.
-->
<!-- inverse属性: 配置关系是否维护.
true: customer不维护关系
false(默认值): customer维护关系
inverse属性: 性能优化.提高关系维护的性能.
原则: 无论怎么放弃,总有一方必须要维护关系.
一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
-->
<set name="linkMens" inverse="true" cascade="delete" >
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan" />
</set>