Hibernate關聯映射之--雙向多對多關聯

剛開始學Hibernate,學到映射關聯,感覺好多映射關係啊,自己總結一下,想都搞清楚

雙向多對多關聯需要兩端都採用Set集合屬性,直接上示例:

首先編寫兩個持久化類Employee和Project和相應的映射文件

public class Employee {
	private Integer employee_id;
	private Set<Project> projects = new HashSet<Project>();
	private String employee_name;
	private String employee_desc;
	public Employee(){
		
	}
	public Integer getEmployee_id() {
		return employee_id;
	}
	public void setEmployee_id(Integer employeeId) {
		employee_id = employeeId;
	}
	public Set<Project> getProjects() {
		return projects;
	}
	public void setProjects(Set<Project> projects) {
		this.projects = projects;
	}
	public String getEmployee_name() {
		return employee_name;
	}
	public void setEmployee_name(String employeeName) {
		employee_name = employeeName;
	}
	public String getEmployee_desc() {
		return employee_desc;
	}
	public void setEmployee_desc(String employeeDesc) {
		employee_desc = employeeDesc;
	}
	
}


 employee類的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<class name="org.jbit.pojo.Employee" table="employee">
		<id name="employee_id" type="java.lang.Integer">
			<column name="employee_id"/>
			<generator class="sequence">
				<param name="sequence">EMPLOYEE_SEQUENCE</param>
			</generator>
		</id>
		<set name="projects" table="r_emp_proj">
			<key column="r_emp_id"/>
			<many-to-many class="org.jbit.pojo.Project" column="r_proj_id"/>
		</set>
		<property name="employee_name" type="java.lang.String">
			<column name="employee_name" length="50" not-null="true"/>
		</property>
		<property name="employee_desc" type="java.lang.String">
			<column name="employee_desc" length="50" not-null="true"/>
		</property>
	</class>
</hibernate-mapping>


project類

package org.jbit.pojo;

import java.util.HashSet;
import java.util.Set;

public class Project {
	private Integer project_id;
	private Set<Employee> members = new HashSet<Employee>();
	private String project_name;
	private String project_desc;
	public Project(){
		
	}
	public Integer getProject_id() {
		return project_id;
	}
	public void setProject_id(Integer projectId) {
		project_id = projectId;
	}
	public Set<Employee> getMembers() {
		return members;
	}
	public void setMembers(Set<Employee> members) {
		this.members = members;
	}
	public String getProject_name() {
		return project_name;
	}
	public void setProject_name(String projectName) {
		project_name = projectName;
	}
	public String getProject_desc() {
		return project_desc;
	}
	public void setProject_desc(String projectDesc) {
		project_desc = projectDesc;
	}
	
}


Project類的映射文件

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<class name="org.jbit.pojo.Project" table="project">
		<id name="project_id" type="java.lang.Integer">
			<column name="project_id"/>
			<generator class="sequence">
				<param name="sequence">PROJECT_SEQUENCE</param>
			</generator>
		</id>
		<set name="members" table="r_emp_proj">
			<key column="r_proj_id"/>
			<many-to-many class="org.jbit.pojo.Employee" column="r_emp_id"/>
		</set>
		<property name="project_name" type="java.lang.String">
			<column name="project_name" length="50" not-null="true"/>
		</property>
		<property name="project_desc" type="java.lang.String">
			<column name="project_desc" length="50" not-null="true"/>
		</property>
	</class>
</hibernate-mapping>

編寫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">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
	<!-- 數據庫URL -->
	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:SJBITDB</property>
	<!-- 數據庫用戶 -->
	<property name="connection.username">epet</property>
	<!-- 數據庫用戶密碼 -->
	<property name="connection.password">jbit</property>
	<!-- 數據庫JDBC驅動 -->
	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
	<!-- 每個數據庫都有其對應的Dialect以匹配其平臺特性 -->
	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
	<!-- 指定當前session範圍和上下文 -->
	<property name="current_session_context_class">thread</property>
	<!-- 是否將運行期生成的SQL輸出到日誌以供調試 -->
	<property name="show_sql">true</property>
	<property name="hbm2ddl.auto">update</property>
	<mapping resource="org/jbit/pojo/Project.hbm.xml"/>
	<mapping resource="org/jbit/pojo/Employee.hbm.xml"/>

</session-factory>

</hibernate-configuration>


編寫測試類,通過控制檯輸出結果

package org.jbit.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.jbit.pojo.Employee;
import org.jbit.pojo.Project;

public class Test {
	public static void main(String[] args) {
		Set<Project> projects = new HashSet<Project>();
		Project project1 = new Project();
		project1.setProject_name("酒店系統");
		project1.setProject_desc("很重要");
		projects.add(project1);
		
		Project project2 = new Project();
		project2.setProject_name("旅遊系統");
		project2.setProject_desc("just do it..");
		projects.add(project2);
		
		Set<Employee> employees = new HashSet<Employee>();
		Employee employee1 = new Employee();
		employee1.setEmployee_name("張三");
		employee1.setEmployee_desc("important");
		employee1.getProjects().add(project1);
		employee1.getProjects().add(project2);
		employees.add(employee1);
		
		Employee employee2 = new Employee();
		employee2.setEmployee_name("李四");
		employee2.setEmployee_desc("important");
		employee2.getProjects().add(project1);
		employee2.getProjects().add(project2);
		employees.add(employee2);
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		
		try {
			sessionFactory = new Configuration().configure().buildSessionFactory();
			session = sessionFactory.openSession();
			transaction = session.beginTransaction();
			session.save(project1);
			session.save(project2);
			session.save(employee1);
			session.save(employee2);
			transaction.commit();
		} catch (Exception e) {
			// TODO: handle exception
			transaction.rollback();
			e.printStackTrace();
		} finally{
			if(null!=session){
				session.close();
			}
			if(null!=sessionFactory){
				sessionFactory.close();
			}
		}
	}
}


 


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章