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