1. 程式人生 > >Hibernate基於外來鍵一對一對映操作例項

Hibernate基於外來鍵一對一對映操作例項

背景:

公民和公民的身份證,是一個一對一的例子,一個公民只有一個身份證。

場景準備:

實體類:Person.java、IdCard.java

實體類以及對映檔案程式碼:

Person.java

public class Person {
	private Integer id;
	private String name;
	
	private IdCard idCard;//關聯的身份證

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public IdCard getIdCard() {
		return idCard;
	}

	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
	
}


Person.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 -->
<!-- 告訴hibernate需要找哪個表 -->
<hibernate-mapping package="h_hbm_oneToOne">

	<!-- User表對應的對映關係 -->
	<class name="Person" table="person">
		<id name="id">
			<generator class="native" />
		</id>
		<property column="name" name="name" type="string" />
		
		<!-- 
			IdCard屬性:IdCard型別
			表達的是本類與IdCard的一對一關係
			採用基於外來鍵的一對一對映的方式
		-->
		<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true" cascade="all">
		
		</many-to-one>
		
				
	</class>
</hibernate-mapping>


IdCard.java

package h_hbm_oneToOne;

public class IdCard {
	private Integer id;
	private String number;
	
	private Person person;//不要初始化,初始化會使物件處於臨時狀態,會使儲存的時候拋異常,關聯的人的物件

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
	
	
}


IdCard.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 -->
<!-- 告訴hibernate需要找哪個表 -->
<hibernate-mapping package="h_hbm_oneToOne">

	<!-- User表對應的對映關係 -->
	<class name="IdCard" table="idCard">
		<id name="id">
			<generator class="native" />
		</id>
		<property column="number" name="number" type="string" />
		
		<!-- 
			person屬性:Person型別
			表達的是本類與IdCard的一對一關係
			採用基於外來鍵的一對一對映的方式
			本方無外間房
			property-ref:寫的是對方對映中外來鍵列對應的屬性名,也就是Person類下的idCard屬性名
		-->
		<one-to-one name="person" class="Person" property-ref="idCard">
		</one-to-one>
				
	</class>
</hibernate-mapping>


測試類:APP.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;

import cn.marer.model.HibernateUtils;

public class APP {
	private static SessionFactory sessionfactory = HibernateUtils.getSessionFactory();
	
	@Test
	public void testSave(){
		Session session = sessionfactory.openSession();
		
		//開啟事務
		session.beginTransaction();
		
		//構建物件
		Person person = new Person();
		person.setName("張三");
		
		IdCard id = new IdCard();
		id.setNumber("123456");
		person.setIdCard(id);
		
//		session.save(id);
		session.save(person);
		
		//提交事務
		session.getTransaction().commit();
		session.close();
	}
	
	
	@Test
	public void testGet(){
		Session session = sessionfactory.openSession();
		
		//開啟事務
		session.beginTransaction();
		
		//獲取一方
//		Person person= (Person) session.get(Person.class, 1);
//		System.out.println(person.getName()+"---->" + person.getIdCard());
		
		
		IdCard id = (IdCard) session.get(IdCard.class, 1);
		System.out.println(id.getNumber() + "---->" + id.getPerson().getName());
		
		
		
		//提交事務
		session.getTransaction().commit();
		session.close();
	}
	
	
	// 解除關聯關係
	@Test
	public void testRemoveRelation(){
		Session session = sessionfactory.openSession();
		
		// 開啟事務
		session.beginTransaction();
		
		// 從無外來鍵方解除關聯關係不可以
//		IdCard id = (IdCard) session.get(IdCard.class, 1);.
//		id.setPerson(null);
		
		
		// 從有外來鍵方解除關聯關係,可以。
		// 在一對一時,只能是有外來鍵方才能維護關聯關係。無外來鍵方不能維護關聯關係。
		Person person = (Person) session.get(Person.class, 1);
		person.setIdCard(null);
		
		
		
		//提交事務
		session.getTransaction().commit();
		session.close();
	}
	
	
	// 刪除對對方的影響
	@Test
	public void testDelte(){
		Session session = sessionfactory.openSession();
		
		// 開啟事務
		session.beginTransaction();
		
		// 如果刪除不能維護外來鍵關聯關係的一方,會報異常,因為外來鍵約束
//		IdCard id = (IdCard) session.get(IdCard.class, 1);
//		session.delete(id);
		
		// 刪除能維護外來鍵關聯關係的一方,可以刪除
		Person person = (Person) session.get(Person.class, 1);
		session.delete(person);
		
		// 有外來鍵方能維護關聯關係,從無外來鍵方不能維護關聯關係
		
		//提交事務
		session.getTransaction().commit();
		session.close();
	}
}



相關推薦

Hibernate基於外來一對一對映操作例項

背景: 公民和公民的身份證,是一個一對一的例子,一個公民只有一個身份證。 場景準備: 實體類:Person.java、IdCard.java 實體類以及對映檔案程式碼: Person.java

Hibernate 基於外來一對一對映(單雙向)

主要內容: 對映關聯關係 一對一關聯對映的策略 基於外來鍵的單(雙)一對一關聯對映 基於主鍵的單(雙)一對一關聯對映 基於外來鍵的單向一對一實際上是多對一關聯對映的特例 採用<many-to-o

Hibernate ORM對映基於外來一對一

概念 一一對應關係,要求雙方都有對方的引用。 實現方式 在Department這一端設定many-to-one關聯關係,但同時給關聯到Manager的外來鍵設定唯一約束 建立持久化類

Hibernate對映詳解--一對一唯一外來關聯對映

  還記得多對一的那個例子嗎?使用者與組。我們在多的一端維護關係,最後生成的表格中,多的一端User中多出來一個欄位groupId用來儲存組的主鍵。這裡,多個使用者可以屬於同一組。即在使用者這個表中,groupId欄位的值是可以重複的。但有的時候可能這個外來鍵值是不可以重複

Hibernate基於的單項,雙向多對多對映關係

今天我們來一起談論下hibernate的基於主鍵的單項,雙向多對多對映關係 首先多對多都是基於主鍵的,沒有基於外來鍵的說法 1.基於主鍵的單項多對多 在這裡就是說中間stuobject是一張關係表,將兩張表的主鍵進行關聯,形成了多對多的關係 程式碼如

hibernate 1對1基於外來

基於外來鍵對映:對於1-1外來鍵關聯,其外來鍵可以存放在任意的一邊,在需要存放外來鍵的一端,增加many-to-one元素,為many-to-one增加unique="true"屬性:另一端使用one-to-one元素,該元素使用property-ref屬性指定使用關聯實體主鍵以外的欄位

hibernate通過外來查詢

      因為hibernate是對物件的操作,所以即使在資料庫中儲存的是user的id,但是在搜尋時仍然使用user物件     DetachedCriteria dc = DetachedCriteria.forClass(CUV.class);       

Hibernate hbm 外來關聯——SSH (Spring+Struts+Hibernate)框架搭建之配置檔案序列六

      hibernate管理資料庫後,bbm.xml的關聯配置很重要,<many-to-one> 與<one-to-many>一定要配置正確             繼

SSH框架之Hibernate資料庫外來如何插入值的問題

package com.teacher.web.action; import java.util.Date; import com.pojos.Course_information; import com.pojos.Teacher_information; import com.teacher.comm.B

Flask-sqlalchemy外來關係對映

本文中,為了測試方便,所以使用sqlite,定義兩張表User Article Article中author_id引用User表中的id,也就是author_id作為User表中id的外來鍵 from flask import Flask from f

Hibernate,關係對映的多對一單向關聯、多對一雙向關聯、一對一關聯、一對一外來關聯、多對多關係關聯

2018-11-10  22:27:02開始寫   下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構:     下圖內容hibernate對映檔案結構介紹   下圖內容hibernate

Hibernate 一對一關聯對映(主關聯VS唯一外來關聯)

一對一關聯對映有兩種:一種是主鍵關聯,一種是“唯一”外來鍵關聯。 主鍵關聯:原理是兩張表的主鍵(ID)保持一致,在獲取的時候根據兩種表中的ID相同來作為關係判斷的標準,這樣的設計好處在於我們不用新增另外的欄位來維護它們之間的關係。 廢話少說,看例子。 在生活一對一的關係還“

七、Hibernate對映之放棄外來的維護

什麼是外來鍵維護? 外來鍵維護就是Hibernate操作資料庫的時候會自動更新與之相關聯的表的外來鍵值,而如果放棄外來鍵維護的話,那麼就僅僅是操作表中的資料,不會修改外來鍵值。 什麼時候需要放棄外來鍵維護? 在多對多關係的表中必須要其中一方放棄維護外來鍵,因為維護外來鍵的一方

Hibernate 對映關係 ---One2One 外來關聯

1.One2One 外來鍵單向關聯 是 many-2-one 的特殊案例,在多的一端使用unique =true, 多的一端配置如下: <classname="Person"table="t_person"> <idname="id"column="id

hibernate5(12)註解對映[4]一對一外來關聯

在實際部落格網站中,文章內容的資料量非常多,它會影響我們檢索文章其它資料的時間,如查詢釋出時間、標題、類別的等。這個時候,我們可以嘗試將文章內容存在另一張表中,然後建立起文章——文章內容的一對一對映 一對一關聯有兩種方式,一種是外來鍵關聯,另一種是複合主鍵關聯

基於MVC4+EasyUI的Web開發框架經驗總結(9)--在Datagrid裡面實現外來欄位的轉義操作

我們在使用EasyUI的時候,很多情況下需要使用到表格控制元件datagrid,這個控制元件控制元件非常強大,使用起來很簡潔,但是我在使用中,發現對於一個表裡面的外來鍵欄位進行轉義,並顯示引用表的一些名稱的操作,卻顯得比較難以實現,找了很多資料,基本上沒有找到對應的解決方案。本文主要介紹我對這種外來鍵欄位轉義

【SSH快速進階】——Hibernate一對一對映(one-to-one)——主關聯對映

  現實生活中,有很多場景需要用到一對一對映,比如每個學生只有一個學生證,每個公民只有一張身份證等。這裡用公民-身份證來舉例說明。      在Hibernate中實現一對一對映,有兩種實現方式:1

Hibernate (八)一對一外來關聯方式)

一對一 對映有兩種方式: 主鍵關聯: id 對應 id 兩個主鍵必須相同 外來鍵關聯: id 對應 xxxid 專門設定一個外來鍵屬性 (推薦使用) 外來鍵關聯方式 例如:下面的例子IdCard 表會有一個專門的外來鍵屬性 personId 對應 pe

淺談Hibernate對映集合屬性以及主外來

首先說明一下什麼叫主鍵以及外來鍵。 主鍵和外來鍵是對於資料庫來說的,資料庫的表才有主鍵外來鍵的說法。 主鍵:主鍵是指標識某個表中唯一且非空的一條記錄行的列,這個列中的值不允許有重複的值,用於確定一個表中的一條記錄,實     際上主鍵就是告訴別人:這個資料列是唯一的。 外來

hibernate雙向一對一關聯對映XML與註解版

雙向一對一關聯對映原理:  雙向的主鍵關聯其實是單向一對一主鍵關聯的一種特殊情況,只不過要在關聯物件的兩端的對映檔案中都要進行<one-to-one>的配置,另外還要在主對映的主鍵一端採