hibernate的映射之四(多對多雙向關聯)
阿新 • • 發佈:2017-12-30
als oot bean odi 生成 指定 數據庫方言 映射文件 格式化sql
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的映射之四(多對多雙向關聯)