【Hibernate】多对多映射
程序员文章站
2022-07-15 08:04:52
...
需求:项目与开发人员
Project Developer
电商系统
曹吉
王春
OA系统
王春
老张
数据库
代码
/**
* 开发人员
*
*
*/
public class Developer {
private int d_id;
private String d_name;
// 开发人员,参数的多个项目
private Set<Project> projects = new HashSet<Project>();
}
/**
* 项目
*
*
*/
public class Project {
private int prj_id;
private String prj_name;
// 项目下的多个员工
private Set<Developer> developers = new HashSet<Developer>();
Project.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.c_many2many">
<class name="Project" table="t_project">
<id name="prj_id">
<generator class="native"></generator>
</id>
<property name="prj_name" length="20"></property>
<!--
多对多映射:
1. 映射的集合属性: “developers”
2. 集合属性,对应的中间表: “t_relation”
3. 外键字段,项目对应的中间表字段: prjId
4. 外键字段,开发者对应的中间表字段: did
5. 集合属性元素的类型
-->
<set name="developers" table="t_relation" cascade="save-update">
<key column="prjId"></key>
<many-to-many column="did" class="Developer"></many-to-many>
</set>
</class>
</hibernate-mapping>
Developer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.c_many2many">
<class name="Developer" table="t_developer">
<id name="d_id">
<generator class="native"></generator>
</id>
<property name="d_name" length="20"></property>
<!--
多对多映射配置: 员工方
name 指定映射的集合属性
table 集合属性对应的中间表
key 指定中间表的外键字段(引用当前表t_developer主键的外键字段)
many-to-many
column 指定外键字段对应的项目字段
class 集合元素的类型
-->
<set name="projects" table="t_relation">
<key column="did"></key>
<many-to-many column="prjId" class="Project"></many-to-many>
</set>
</class>
</hibernate-mapping>
public class App1_save {
private static SessionFactory sf;
static {
sf = new Configuration()
.configure()
.addClass(Project.class)
.addClass(Developer.class) // 测试时候使用
.buildSessionFactory();
}
// 1. 多对多,保存 【只能通过一方维护另外一方,不能重复维护!】
@Test
public void save() {
Session session = sf.openSession();
session.beginTransaction();
/*
* 模拟数据:
电商系统(曹吉,王春)
OA系统(王春,老张)
*/
// 创建项目对象
Project prj_ds = new Project();
prj_ds.setPrj_name("电商系统");
Project prj_oa = new Project();
prj_oa.setPrj_name("OA系统");
// 创建员工对象
Developer dev_cj = new Developer();
dev_cj.setD_name("曹吉");
Developer dev_wc = new Developer();
dev_wc.setD_name("王春");
Developer dev_lz = new Developer();
dev_lz.setD_name("老张");
// 关系 【项目方】
prj_ds.getDevelopers().add(dev_cj);
prj_ds.getDevelopers().add(dev_wc); // 电商系统(曹吉,王春)
prj_oa.getDevelopers().add(dev_wc);
prj_oa.getDevelopers().add(dev_lz); // OA系统(王春,老张)
// 保存
//session.save(dev_cj);
//session.save(dev_wc);
//session.save(dev_lz);
session.save(prj_ds);
session.save(prj_oa); // 必须要设置级联保存
session.getTransaction().commit();
session.close();
}
}
上一篇: 「VIM」编辑模式
下一篇: 「python」字符串、列表、元组、字典