Hibernate 关联映射之---- 多对多双向映射

一. JavaBean设计

这次以开发者(多)对项目(多)为例.


二. DB设计


三. 配置Developer.hbm.xml,Project.hbm.xml类配置文件

<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="edu.mapping.many2many">
	
	<class name="Developer" table="c_developer">
		
		<!-- 主键 ,映射-->
		<id name="d_id">
			<generator class="native"/>
		</id>
		
		<!-- 非主键,映射 -->
		<property name="d_name"></property>
		
		<set name="projects" table="c_relation" inverse="true">
			<key column="d_id"></key>
			<many-to-many column="pro_id" class="Project"></many-to-many>
		</set>
	</class>

</hibernate-mapping>

<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="edu.mapping.many2many">
	
	<class name="Project" table="c_project">
		
		<!-- 主键 ,映射-->
		<id name="prj_id">
			<generator class="native"/>
		</id>
		
		<!-- 非主键,映射 -->
		<property name="prj_name"></property>
		
		<set name="developers" table="c_relation" cascade="save-update">
			<key column="pro_id"></key>
			<many-to-many column="d_id"  class="Developer"/>
		</set>
		
	</class>

</hibernate-mapping>

注意:

原则上,多对多不区分更新的一方,但是实际开发中往往要遵守一定的规则,好比我如是配置后,一般就是通过Project管理Developer,而不反过来管理。

另外cascade="save-update"这句,意思就是级联操作,我们只需要操作Prohect,存储在Project中的deverlopers属性会自动存入c_developer表,而不需要像一对多那样,两者都要保存。

四. hibernate总配置文件hibernate.cfg.xml

同之前一对多的配置.

五. 编写测试代码App.class

package edu.mapping.many2many;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

public class App {

	private static SessionFactory sf =null;
	static {
		sf = new Configuration()
		.configure()
		.addClass(Project.class)
		.addClass(Developer.class)
		.buildSessionFactory();
	}
	
	
	@Test
	public void insert(){
		Session session = sf.openSession();
		session.beginTransaction();
		
		Developer developer1 = new Developer();
		Developer developer2 = new Developer();
		Developer developer3 = new Developer();

		developer1.setD_name("徐璇");
		developer2.setD_name("徐波");
		developer3.setD_name("徐盛");
		
		//new Set
		Set<Developer> set1 = new HashSet<Developer>();
		set1.add(developer1);
		set1.add(developer2);
		
		Set<Developer> set2 = new HashSet<Developer>();
		set2.add(developer2);
		set2.add(developer3);
		
		
		Project project1 = new Project();
		Project project2 = new Project();
		project1.setPrj_name("英雄联盟");
		project2.setPrj_name("300英雄");
		
		
		/*
		 * 之前是这样的方式添加数据,先get后add,所以不在类中new HashSet会报空指针异常
		project1.getDevelopers().add(developer1);
		project1.getDevelopers().add(developer2);
		project2.getDevelopers().add(developer2);
		project2.getDevelopers().add(developer3);
		
		*/
		
		//现在是new 好set后 在用setter赋值
		project1.setDevelopers(set1);
		project2.setDevelopers(set2);
		
		
		
		session.save(project1);
		session.save(project2);
		

		session.getTransaction().commit();
		session.close();
	}
	
}
关于在javabean中set<?>相关需不需要new 的一些问题,在上述的注释中作了一下讨论,都是小问题了。

console运行结果:


再来看看数据库中是否数据正常。


六. 总结

还剩一个one-to-one明天补上。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值