分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

hibernate的映射之四(多对多双向关联)

发布时间:2023-09-06 01:33责任编辑:林大明关键词:暂无标签

Many-to-Many 多对多的映射可以使用一组Java集合不包含任何重复的元素来实现。我们已经看到了Hibernate如何设置映射集合。

集(SET)被映射到与映射表中<set>元素,并以java.util.HashSet初始化。您可以使用Set集合在类中时,集合不需要重复的元素。

多对多双向关联:

由于是双向关联,所以需要在二个实体中植入对方的实体集合。

我依旧以员工和项目为例子。

1.准备JavaBean(持久化类)

员工实体类

public class Employee {
???private Integer empid;
???private String empname;
???//植入项目集合 ??一个员工可以参与多个项目
???private Set<Project> projects=new HashSet<Project>();

???public Integer getEmpid() {
???????return empid;
???}

???public void setEmpid(Integer empid) {
???????this.empid = empid;
???}

???public String getEmpname() {
???????return empname;
???}

???public void setEmpname(String empname) {
???????this.empname = empname;
???}

???public Set<Project> getProjects() {
???????return projects;
???}

???public void setProjects(Set<Project> projects) {
???????this.projects = projects;
???}
}


项目实体类
public class Project {
???private Integer proid;
???private String proname;
???//植入员工集合 ?一个项目可以由多个人参与
???private Set<Employee> employees = new HashSet<Employee>();

???public Integer getProid() {
???????return proid;
???}

???public void setProid(Integer proid) {
???????this.proid = proid;
???}

???public String getProname() {
???????return proname;
???}

???public void setProname(String proname) {
???????this.proname = proname;
???}

???public Set<Employee> getEmployees() {
???????return employees;
???}

???public void setEmployees(Set<Employee> employees) {
???????this.employees = employees;
???}
}


2.创建持久化类的映射文件
Employee.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.day04mapping.manytomany.entity">
???<!--表名称-->
???<class name="Employee" table="EMPLOYEE" schema="root">
???????<!--列名-->
??????<id name="empid" column="EMPID">
??????????<!--主键生成的策略 ?native:自动生成主键字段-->
??????????<generator class="native"></generator>
??????</id>
????<property name="empname" column="EMPNAME"></property>
???????<!--单相关联-->
???????<!--植入set 标签 ?table 中间表的表名-->
???????<set name="projects" ?table="PROEMP">
???????????<!--column ?多的一方表在中间表的外键列-->
???????????<key column="REMPID"></key>
???????????<!--column ?中间表的另外一个外键列-->
???????????<many-to-many column="RPROID" class="Project"></many-to-many>
???????</set>
???</class>
</hibernate-mapping>


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.day04mapping.manytomany.entity">
???<!--表名称-->
???<class name="Project" table="PROJECT" schema="root">
???????<!--列名-->
??????<id name="proid" column="PROID">
??????????<!--主键生成的策略 ?native:自动生成主键字段-->
??????????<generator class="native"></generator>
??????</id>
????<property name="proname" column="PRONAME"></property>

???????<!--双相关联-->
???????<!--植入set 标签 ?save-update 保存数据 ??inverse="true" 放弃维护 消除多余的update语句 ??false 主动维护 ?-->
???????<set name="employees" ?table="PROEMP" ?cascade="save-update">
???????????<!--多的一方表的外键列-->
???????????<key column="RPROID"></key>
???????????<many-to-many column="REMPID" class="Employee"></many-to-many>
???????</set>
???</class>
</hibernate-mapping>


3.hibernate.cfg.xml主配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
???????"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
???????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
???<session-factory>
???????<!-- 指定数据库所用到的驱动 -->
???????<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
???????<!-- 指定数据库链接的url,hibernate链接的数据库名 -->
???????<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
???????<!-- 指定连接数据库的用户名 -->
???????<property name="connection.username">root</property>
???????<!-- 指定连接数据库的用户口令 -->
???????<property name="connection.password">root</property>
???????<!-- Enable Hibernate‘s automatic session context management -->
???????<property name="current_session_context_class">thread</property>

???????<!--格式化sql -->
???????<property name="format_sql ">true</property>
???????<!-- 打印sql 控制台-->
???????<property name="show_sql">true</property>
???????<!-- 指定数据库方言 -->
???????<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
???????<!-- 根据需要自动创建数据库表 -->
???????<property name="hbm2ddl.auto">update</property>

???????<!--多对多-->
???????<mapping resource="cn/day04mapping/manytomany/entity/Project.hbm.xml"></mapping>
???????<mapping resource="cn/day04mapping/manytomany/entity/Employee.hbm.xml"></mapping>

???</session-factory>
</hibernate-configuration>


4.书写测试类和方法

//多对多双向关联
@Test
public void test02(){
???Session session = HibernateUtil.getSession();
???//开启事务
???Transaction transaction = session.beginTransaction();
???//员工方
???Employee emp=new Employee();
???emp.setEmpname("马化腾");
???//员工方
???Employee emps=new Employee();
???emps.setEmpname("刘强东");
???//项目方 ??主的一方
???Project project=new Project();
???project.setProname("零售");

???project.getEmployees().add(emp);
???project.getEmployees().add(emps);
???//保存数据
???session.save(project);
???//提交事务
???transaction.commit();
}



 


hibernate的映射之四(多对多双向关联)

原文地址:https://www.cnblogs.com/sujulin/p/8149897.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved