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

Posted 努力奋斗吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate的映射之四(多对多双向关联)相关的知识,希望对你有一定的参考价值。

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的映射之四(多对多双向关联)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

一口一口吃掉Hibernate——多对多关联映射

hibernate------映射相关

hibernate多对多关联映射

hibernate学习四 hibernate关联关系映射