多对多映射

1、创建三张表,工程表 、 员工表 、 关系表
一个工程对应多个员工,一个员工也可能参与多个工程开发,即为多对多

create table t_project(
	pro_Id int primary key auto_increment,
    proName varchar(20)
)DEFAULT charset=utf8;

create table t_developer(
	dev_Id int primary key auto_increment,
    dev_Name varchar(20)
)DEFAULT charset=utf8;
create table t_relations(
	dev_Id int ,
    pro_Id int
)DEFAULT charset=utf8;

2、创建实体类

员工实体类:

public class developer {
	private int dev_Id;
	private String dev_Name;
	private Set<project> pros = new HashSet<project>();
	public int getDev_Id() {
		return dev_Id;
	}
	public void setDev_Id(int dev_Id) {
		this.dev_Id = dev_Id;
	}
	public String getDev_Name() {
		return dev_Name;
	}
	public void setDev_Name(String dev_Name) {
		this.dev_Name = dev_Name;
	}
	public Set<project> getPros() {
		return pros;
	}
	public void setPros(Set<project> pros) {
		this.pros = pros;
	}
	
}

员工配置文件:develop.hbm.xml

<hibernate-mapping package="manytomany">
	
	<class name="developer" table="t_developer">
		<id name="dev_Id">
			<generator class="native"></generator>
		</id>	
		<property name="dev_Name" length="20"></property>
		
		<!-- 
			多对多关联映射配置   员工方
			developer 映射关键点:
			name 指定映射的集合属性
			table 集合属性对应的中间表
			key 中间表的外键字段
			many-to-many  
				column 指定外键字段对应的项目字段
				class 集合元素的类型
		 -->
		 <set name="pros"  table="t_relations" >  
		 	 <key column="dev_Id"></key>
		 	 <many-to-many column="pro_Id" class="project"/>
		 </set>
		 
	</class>
	

</hibernate-mapping>


工程实体类:

public class project {
	private int pro_Id;
	private String proName;
	
	private Set<developer> devs = new HashSet<developer>();
	public int getPro_Id() {
		return pro_Id;
	}
	public void setPro_Id(int pro_Id) {
		this.pro_Id = pro_Id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	
	public Set<developer> getDevs() {
		return devs;
	}
	public void setDevs(Set<developer> devs) {
		this.devs = devs;
	}
	
}

工程对象配置文件:project.hbm.xml

<hibernate-mapping package="manytomany">
	
	<class name="project" table="t_project">
		<id name="pro_Id">
			<generator class="native"></generator>
		</id>	
		<property name="proName" length="20"></property>
		
		<!-- 
			多对多关联映射:
			 映射的集合属性
			 集合属性对应的中间表
			 外键字段
			 外键字段对应的中间表
			 集合属性元素类型
			 
		 -->
		 <set name="devs"  table="t_relations" cascade="save-update" inverse="false" > 
		 	 <key column="pro_Id"></key>
		 	 <many-to-many column="dev_Id" class="developer"/>
		 </set>
		 
	</class>
	

</hibernate-mapping>

3、进行测试:

public class testManyToMany {
	private static SessionFactory sf ;
	static{
		sf = new Configuration()
		.configure()
		.addClass(project.class)
		.addClass(developer.class)
		.buildSessionFactory();
	}
	
	// 多对多
		//1. 设置inverse属性,对保存数据影响?
		// 有影响。
		// inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;
		// inverse=true,  没有控制权, 不会往中间表插入数据。
	@Test
	public void testSaveMany() throws Exception {
		developer dev1 = new developer();
		dev1.setDev_Name("wangwu");
		
		developer dev2 = new developer();
		dev2.setDev_Name("lisi");
		
		developer dev3 = new developer();
		dev3.setDev_Name("zhangsan");
		
		project pro1 = new project();
		pro1.setProName("wushui");
		pro1.getDevs().add(dev1);
		pro1.getDevs().add(dev2);
		
		project pro2 = new project();
		pro2.setProName("zhangbozhi");
		pro2.getDevs().add(dev1);
		pro2.getDevs().add(dev3);
		
		Session ss = sf.openSession();
		ss.beginTransaction();
//		ss.save(dev1);
//		ss.save(dev2);
//		ss.save(dev3);
		ss.save(pro1);
		ss.save(pro2);//需要设置级联,如果inverse=true,级联失效
		
		ss.getTransaction().commit();
		ss.close();
	}
	//2 .设置inverse属性, 对获取数据影响?  无
	@Test
	public void testGetMany() throws Exception {
		Session ss = sf.openSession();
		ss.beginTransaction();
		project project = (project)ss.get(project.class, 3);
		System.out.println(project.getProName()+project.getDevs());
		
		ss.getTransaction().commit();
		ss.close();
	}
	//3. 设置inverse属性, 对解除关系影响?
		// 有影响。
		// inverse=false ,有控制权, 解除关系就是删除中间表的数据。
		// inverse=true, 没有控制权,不能解除关系。
	@Test
	public void testclearMany() throws Exception {
		Session ss = sf.openSession();
		ss.beginTransaction();
		project project = (project)ss.get(project.class, 3);
		project.getDevs().clear();
		ss.getTransaction().commit();
		ss.close();
	}
	//3. 设置inverse属性,对删除数据的影响?
		// inverse=false, 有控制权。 先删除中间表数据,再删除自身。
		// inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除
	@Test
	public void testdeleteMany() throws Exception {
		Session ss = sf.openSession();
		ss.beginTransaction();
		project project = (project)ss.get(project.class, 2);
		ss.delete(project);
		ss.getTransaction().commit();
		ss.close();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值