hibernate的映射之二(一对多双向关联)
生活随笔
收集整理的這篇文章主要介紹了
hibernate的映射之二(一对多双向关联)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
hibernate的一對多雙關聯
一對多關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是一指向多
?
hihernate一對多關聯映射(雙向Dept<----->Emp)
一對多雙向關聯映射:
* 在一一端的集合上使用<key>,在對方表中加入一個外鍵指向一一端
? ? ?? * 在多一端采用<many-to-one>
?
注意:<key>標簽指定的外鍵字段必須和<many-to-one>指定的外鍵字段一致,否則引用字段的錯誤
?
?
?
下面就以員工和部門為例:
這里的意思是既可以根據在查找部門時根據部門去找該部門下的所有員工,又能在檢索員工時獲取某個員工所屬的部門。
需要員工實體中植入部門實體。同時也需要在部門實體植入員工集合。
?
1.準備JavaBean
Dept實體類
public class Dept {private Integer deptid;
private String deptname;
//植入員工集合
private Set<Emp> emps=new HashSet<Emp>();
public Integer getDeptid() {
return deptid;
}
public void setDeptid(Integer deptid) {
this.deptid = deptid;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
Emp實體類
public class Emp {
private Integer empno;
private String ename;
//植入部門實體
private Dept dept=new Dept();
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
}
2.準備持久化類的映射文件
Dept.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.onetomany.entity">
<!--表名稱-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主鍵生成的策略 native:自動生成主鍵字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
<!--植入set 標簽 -->
<set name="emps">
<!--多的一方表的外鍵列-->
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
</class>
</hibernate-mapping>
Emp.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.onetomany.entity">
<!--表名稱-->
<class name="Emp" table="EMP" schema="root">
<!--列名-->
<id name="empno" column="EMPNO">
<!--主鍵生成的策略 native:自動生成主鍵字段-->
<generator class="native"></generator>
</id>
<property name="ename" column="ENAME"></property>
<!--一對多
員工是多的一方
name:Emp中植入一方的屬性名稱
column;數據庫中外鍵列的值
class:植入一方的屬性的類型
-->
<many-to-one name="dept" column="deptno" class="Dept"></many-to-one>
</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/onetomany/entity/Dept.hbm.xml"></mapping>
<mapping resource="cn/day04mapping/onetomany/entity/Emp.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
4.書寫測試類
// 一對多雙向關聯 hibernate工具類的運用@Test
public void test03(){
Session session = HibernateUtil.getSession();
String hql="from Dept";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
for (Dept item:list){
System.out.println(item.getDeptname());
System.out.println("==================");
for (cn.day04mapping.onetomany.entity.Emp emp:item.getEmps()){
System.out.println(emp.getEname());
}
}
System.out.println("===============================================根據員工編號查詢部門");
cn.day04mapping.onetomany.entity.Emp emp=session.load(cn.day04mapping.onetomany.entity.Emp.class,1);
System.out.println(emp.getDept().getDeptname());
}
hibernate工具類 public class HibernateUtil {
static Configuration cfg;
static SessionFactory factory;
static ThreadLocal<Session> td;
//靜態代碼塊
static {
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();
td=new ThreadLocal<Session>();
}
public static Session getSession(){
//看看有無線程變量
Session session = td.get();
if (session==null){
//線程中沒有session對象 創建一個
session = factory.openSession();
td.set(session);
}
//沒有和當前線程綁定
return session;
}
public static void closeSession(){
Session session = td.get();
td.set(null);
session.close();
}
}
?
? ??
轉載于:https://www.cnblogs.com/sujulin/p/8135709.html
總結
以上是生活随笔為你收集整理的hibernate的映射之二(一对多双向关联)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快看Sample代码,速学Swift语言
- 下一篇: Redis 常用命令学四:集合类型命令