Hibernate 关联映射之---- 多对多双向映射
2016-04-09 21:33
369 查看
一. JavaBean设计
这次以开发者(多)对项目(多)为例.
二. DB设计
三. 配置Developer.hbm.xml,Project.hbm.xml类配置文件
注意:
原则上,多对多不区分更新的一方,但是实际开发中往往要遵守一定的规则,好比我如是配置后,一般就是通过Project管理Developer,而不反过来管理。
另外cascade="save-update"这句,意思就是级联操作,我们只需要操作Prohect,存储在Project中的deverlopers属性会自动存入c_developer表,而不需要像一对多那样,两者都要保存。
四. hibernate总配置文件hibernate.cfg.xml
同之前一对多的配置.
五. 编写测试代码App.class
console运行结果:
再来看看数据库中是否数据正常。
六. 总结
还剩一个one-to-one明天补上。
这次以开发者(多)对项目(多)为例.
二. 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明天补上。
相关文章推荐
- Android 开源框架介绍序列表
- 设置stm32系统各部分时钟
- 通过例子学习 Keystone - 每天5分钟玩转 OpenStack(19)
- jsp中radio的性别信息的数据回显
- Java 浅谈输入输出流
- 剑指Offer--005-从尾到头打印链表
- 第一次启动APP,欢迎页出现一次
- poj天梯300题
- kvm 虚拟化 virsh,virt-manager 删除虚拟机
- 《Effective STL》学习笔记(第四部分)
- js获取url中传递的参数
- 计算字符串最后一个单词的长度,单词以空格隔开
- EasyRecovery数据恢复(U盘)
- android 基础知识
- 新人小窝
- 图片轮播器 部分自用
- httpSession的正确理解
- KMP算法简单分析
- lintcode: Maximum Subarray
- 软件工程个人作业04