1. 程式人生 > >hibernate中關聯關係一對多對映雙向,級聯刪除,inverse屬性解析

hibernate中關聯關係一對多對映雙向,級聯刪除,inverse屬性解析

班級和學生一對多雙向對映

Class.java

package com.java1234.model;
import java.util.HashSet;
import java.util.Set;
public class Class {
private long id;
private String name;
private Set<Student> students=new HashSet<Student>();
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}

}

Student.java

package com.java1234.model;
public class Student {
private long id;
private String name;
private Class c;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}

}

Class.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="com.java1234.model">
<class name="Class" table="t_class">
<id name="id" column="classId">
<generator class="native"></generator>
</id>
<property name="name" column="className"></property>
<set name="students" cascade="delete" inverse="true">
<key column="classId"></key>
<one-to-many class="com.java1234.model.Student"/>
</set>
</class>

</hibernate-mapping>

Student.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="com.java1234.model">
<class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<many-to-one name="c" column="classId" class="com.java1234.model.Class" cascade="save-update">                     </many-to-one>

</class>

</hibernate-mapping>

StudentTest.java

package com.java1234.service;


import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.java1234.model.Class;
import com.java1234.model.Student;
import com.java1234.util.HibernateUtil;
public class StudentTest {
private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
private Session session;
@Before
public void setUp() throws Exception {
session=sessionFactory.openSession(); // 生成一個session
    session.beginTransaction(); // 開啟事務
}
@After
public void tearDown() throws Exception {
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
@Test
public void testSaveClassAndStudent() {
Class c=new Class();
    c.setName("08計本");
    Student s1=new Student();
    s1.setName("張三");
    Student s2=new Student();
    s2.setName("李四");
    c.getStudents().add(s1);
    c.getStudents().add(s2);    
    session.save(c);
    
}
@Test
public void getStudentsByClass(){
Class c=(Class)session.get(Class.class, Long.valueOf(2));
Set<Student> students=c.getStudents();
Iterator it=students.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s);
}
}

@Test
public void testAdd(){
Class c=new Class();
    c.setName("09計本");   
    Student s1=new Student();
    s1.setName("王五");
    session.save(c);
    session.save(s1);
}

@Test
public void testInverse(){
Class c=(Class)session.get(Class.class, Long.valueOf(1));
Student s=(Student)session.get(Student.class, Long.valueOf(1));
s.setC(c);
c.getStudents().add(s);
}

@Test
public void testDeleteClassCascade(){
Class c=(Class)session.get(Class.class, Long.valueOf(1));
session.delete(c);
}

}

解析

1.testSaveClassAndStudent()中只把c物件放在session中,配置對映檔案Class.hbm.xml時,也要加上cascade="save-update"

2.inverse屬性解析

先執行testAdd()方法,得到資料庫如下圖:

接著執行testInverse(),這兩句話執行的sql如下,資料庫自動補全student表裡的classId為1

                 s.setC(c);

c.getStudents().add(s);

當在Class.hbm.xml對映檔案中設定inverse="true"屬性是,只用寫s.setC(c);就行了,sql語句就只有前面那句了。

3.級聯刪除解析

在Class.hbm.xml中配置cascade="delete",可以實現方法testDeleteClassCascade()中,只要刪除c,資料庫中也會自動刪除對應的student資訊。

相關推薦

hibernate關聯關係一對對映雙向刪除inverse屬性解析

班級和學生一對多雙向對映 Class.java package com.java1234.model; import java.util.HashSet; import java.util.Set; public class Class { private long id

hibernate關聯關係一對

1. 什麼是關聯(association)   1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:       public class A{         priva

hibernate關聯一對(4)

什麼是關聯(association) 1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如: public class A{ private B b = new B(); public

hibernate關聯一對新增查詢普通刪除

一、什麼是關聯(association) 1、關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。 2、關聯的分類:關聯可以分為一對一、一對多/多對一、多對多關聯 關聯是有方向的 關聯的關鍵點都在外來鍵上 二、如何建立一對多雙向

深入研究Hibernate之三:一對雙向

這樣:若沒有inverse="true",則發如下sql: Hibernate: select hibernate_sequence.nextval from dual Hibernate: insert into t_student (name, idcard, cid, id) values (?, 

一對新增查詢刪除

1. 什麼是關聯(association)   1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:       public class A{         private B b = new B;         publ

表聯查時的sql刪除語句的寫法刪除將相關聯的數據刪除

upd family 限定 ria 相關 _id sans 怎樣 round mysql多表關聯刪除 DELETE刪除多表數據,怎樣才能同時刪除多個關聯表的數據呢?這裏做了深入的解釋:  1 delete from t1 where 條件  2 delete t1 from

Hibernate一對關聯關係(單向和雙向

雙向關聯:主表中有從表的屬性,從表中有主表的屬性。 單向關聯:主表中只有從表的屬性。            建立兩個類檔案:Person,card package c

Hibernate 單向對一、單向一對雙向一對關聯關係詳解

一對多關係是最普遍的對映關係。比如部門和職工 一對多:從部門的角度,一個部門對應多個職工 多對一:從職工的角度,多個職工對應一個部門 資料庫表中結構: 表 department:did departname 表 Employee:eid   en

Hibernate關聯關係對映-----基於連線表的單向一對對映

實體:package uni.many2one.jointable; public class Parent { private int id; private String name; private Child child; public Parent() {

Hibernate關聯關係對映之一對對映

1. 編寫客戶和聯絡人的JavaBean程式(注意一對多的編寫規則) * 客戶的JavaBean如下 public class Customer { private Long cust_id; private String cust_name; private Lo

Hibernate關聯關係對映對映

**技術分析之多對多JavaBean的編寫** 1. 編寫使用者和角色的JavaBean * 使用者的JavaBean程式碼如下 public class User { private Long user_id; private String user_code

Hibernate Day03 表與表之間的關係一對關係之間的配置對映

在配置對映檔案時下圖關係為一對多的情況 首先在多的一方放入一的屬性。在一的一方放入多的集合。在hibernate中採用set集合下圖為客戶對應多個聯絡人 在對應的實體類中新增的程式碼如下:: 這是在多的一方的實體類中插入的程式碼 這是在一的一方的實體類中新增的程式碼如下圖:

Hibernate學習(三)———— 一對對映關係

 序言        前面兩節講了hibernate的兩個配置檔案和hello world!。還有hibernate的一級快取和三種狀態,基本上hibernate就懂一點了,從這章起開始一個很重要的知識點,hibernate的關係對映。一對一、一對多、多對多的講解。,希望你們能從中學到東西,我也從中鞏固自己

一口一口吃掉Hibernate(五)——一對單向關聯映射

term student hash pow gravity 允許 pri pac 處理 版權聲明:本文為博主原創文章,未經博主允許不得轉載。如需轉載請聲明:【轉自 http://blog.csdn.net/xiaoxian8023 】 在上一篇博客《一口一

laravel的模型關聯之(一對)

所有 直接 如果 技術分享 富文本編輯器 9.png 作用 clas style 一對多 一對多就相當於,一個用戶有多篇文章,這多篇文章都對應一個用戶 這是一張文章表,一個用戶有多篇文章,這裏是在用戶模型裏面獲取用戶的所有文章, 第二個參數就是獲取的模型文章表(post)

Hibernate - 繼承關聯關係對映

對於面向物件的程式設計語言而言,繼承和多型是兩個最基本的概念。Hibernate 的繼承對映可以理解持久化類之間的繼承關係。例如:人和學生之間的關係。學生繼承了人,可以認為學生是一個特殊的人,如果對人進行查詢,學生的例項也將被得到。 Hibernate支援三種繼承對映策略:

Hibernate 一對對映

Hibernate 一對多對映(單向查詢/雙向查詢) >>  查詢一個學校(School)中的所有學生(Student)姓名資訊。   實現過程 1. Stduent.java        

Hibernate關聯關係關聯關係的CRUD操作

========================================================== ========================================================== 1.專案結構: =====

hibernate關聯一對關聯

資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多 注1:資料庫多表聯接查詢 永遠就是二個表的聯接查詢 A B C D t1 C t