1. 程式人生 > >hibernate中多對多對映配置詳細解析

hibernate中多對多對映配置詳細解析

1.hibernate.cfg.xml檔案

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
    <!-- 通常,一個session-factory節點代表一個數據庫 -->
	<session-factory>
		<!-- 1.資料庫連線配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hib-demo</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<!--資料庫方法配置,hibernate在執行的時候,會根據不同的方言生成符合當前資料庫語法的sql  -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		
		<!-- 2.其他相關配置 -->
		   <!--2.1顯示hibernate在執行的時候執行的sql語句  -->
		<property name="hibernate.show_sql">true</property>
		   <!-- 2.2格式化sql 
		<property name="hibernate.format_sql">true</property>-->
		<!--    2.3自動建表  -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 3.載入所有對映 
		<mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
	</session-factory>
</hibernate-configuration>

2.Developer

package cn.itcast.c_many2many;
 
import java.util.HashSet;
import java.util.Set;
 
//開發人員資訊
public class Developer {
	private Integer d_id;//開發人員編號
	private String d_name;//開發人員姓名
	//開發人員參與的多個專案
	private Set<Project> projects=new HashSet<Project>();
	public Integer getD_id() {
		return d_id;
	}
	public void setD_id(Integer d_id) {
		this.d_id = d_id;
	}
	public String getD_name() {
		return d_name;
	}
	public void setD_name(String d_name) {
		this.d_name = d_name;
	}
	public Set<Project> getProjects() {
		return projects;
	}
	public void setProjects(Set<Project> projects) {
		this.projects = projects;
	}
	
	
 
}

3.Project

package cn.itcast.c_many2many;
 
import java.util.HashSet;
import java.util.Set;
 
public class Project {
	private Integer prj_id;//專案編號
	private String prj_name;//專案名稱
	//專案下的多個員工
	private Set<Developer> developers=new HashSet<Developer>();
	public Integer getPrj_id() {
		return prj_id;
	}
	public void setPrj_id(Integer prj_id) {
		this.prj_id = prj_id;
	}
	public String getPrj_name() {
		return prj_name;
	}
	public void setPrj_name(String prj_name) {
		this.prj_name = prj_name;
	}
	public Set<Developer> getDevelopers() {
		return developers;
	}
	public void setDevelopers(Set<Developer> developers) {
		this.developers = developers;
	}
	
	
	
 
}

4.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">
 
<!-- 
  This mapping demonstrates content-based discrimination for the
  table-per-hierarchy mapping strategy, using a formula
  discriminator.
-->
<!--對映檔案:對映一個實體類物件,描述一個物件最終可以直接儲存物件資料到資料庫中  -->
<!-- package:要對映的物件所在的包(可選,如果不指定,此檔案下所有的類都要指定全路徑) 
    auto-import 預設為true,在寫HQL的時候自動匯入包名
            如果指定為false,在寫HQL的時候必須要寫上類的全名-->
<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"></property>
	   
	    <set name="projects" table="t_relation">
	       <key column="did"></key>
	       <many-to-many column="prjId" class="Project"></many-to-many>
	    </set>
	    
	     
	</class>
	
 
</hibernate-mapping>

5.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">
 
<!-- 
  This mapping demonstrates content-based discrimination for the
  table-per-hierarchy mapping strategy, using a formula
  discriminator.
-->
<!--對映檔案:對映一個實體類物件,描述一個物件最終可以直接儲存物件資料到資料庫中  -->
<!-- package:要對映的物件所在的包(可選,如果不指定,此檔案下所有的類都要指定全路徑) 
    auto-import 預設為true,在寫HQL的時候自動匯入包名
            如果指定為false,在寫HQL的時候必須要寫上類的全名-->
<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"></property>
	    
	     <!-- 多對多對映:
	         1.對映的集合屬性:developers
	         2.集合屬性:對應的中間表,t_relation
	         3.外來鍵欄位:prjid
	         4.外來鍵欄位:對應的中間表字段,did
	         5.集合屬性元素的型別 -->
	    <set name="developers" table="t_relation">
	        <key column="prjId"></key>
	        <many-to-many column="did" class="Developer"></many-to-many>
	    </set>
	    
	    
	     
	</class>
	
 
</hibernate-mapping>

6.junit測試

package cn.itcast.c_many2many;
 
 
 
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
 
public class App_save {
	private static SessionFactory sf;
	static{
		sf=new Configuration()
		.configure()
		.addClass(Project.class)
		.addClass(Developer.class)  //測試的時候使用
		.buildSessionFactory();
	}
	
	//多對多資料的儲存,只能通過一方維護另一方,不能重複維護!
	@Test
	public void Save() {
		Session session=sf.openSession();
		session.beginTransaction();
	    //建立專案物件
		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_cj);
		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();
		//得到九條結果
		/*Hibernate: insert into t_developer (d_name) values (?)
		Hibernate: insert into t_developer (d_name) values (?)
		Hibernate: insert into t_developer (d_name) values (?)
		Hibernate: insert into t_project (prj_name) values (?)
		Hibernate: insert into t_project (prj_name) values (?)
		Hibernate: insert into t_relation (prjId, did) values (?, ?)
		Hibernate: insert into t_relation (prjId, did) values (?, ?)
		Hibernate: insert into t_relation (prjId, did) values (?, ?)
		Hibernate: insert into t_relation (prjId, did) values (?, ?)
	*/
		
	}
	
	@Test
	public void Save2() {
		Session session=sf.openSession();
		session.beginTransaction();
		
	
		session.getTransaction().commit();
		session.close();
	
		
		
	}
}