一. 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明天补上。