hibernate中多對多對映配置詳細解析
阿新 • • 發佈:2018-11-24
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();
}
}