Hibernate学习笔记 二---多表创建与操作

这篇博客详细介绍了在Hibernate中如何实现一对多的关联关系映射,并提供了具体的建表原则、实体创建、映射配置及测试代码,通过实例展示了如何在多的一方创建外键指向一的一方主键,成功关联两张表。
摘要由CSDN通过智能技术生成
一对多的关联关系映射并操作

表与表的三种关系建表原则

  • 一对多 :在多的一方创建外键指向一的一方的主键

  • 多对多 :创建一个中间表,中间表中至少两个字段作为外键分别指向多对多双方的主键

  • 多对一 :略
    在这里插入图片描述

  • 创建客户实体

  • 创建联系人实体

  • 创建映射

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值