您的位置:首页 > 其它

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

2016-04-09 21:33 369 查看
一. 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明天补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: