Hibernate One-To-One Mapping

  • Hibernate 一對一映射關系(唯一外鍵映射)
  • 用戶基本信息與擴展信息的映射關系

我們先來看看這一對一映射可以用在什么場景。

需求:錄入用戶基本信息,并且可以擴展用戶擴展信息

那么我們可以知道 用戶基本信息用戶擴展信息 是形成一 一對應關系的

關系圖如下:


one-to-one mapping

表創建SQL:
<pre>
CREATE TABLE BaseInfo (
baseinfo_id VARCHAR(32) NOT NULL ,
baseinfo_mobile VARCHAR(11) NOT NULL UNIQUE,
extendinfo_id VARCHAR(32) NOT NULL,
PRIMARY KEY (baseinfo_id)
);

CREATE TABLE ExtendInfo (
extendinfo_id VARCHAR(32) NOT NULL ,
extendinfo_email VARCHAR(32),
extendinfo_weibo VARCHAR(32),
extendinfo_qq VARCHAR(32),
extendinfo_wechat VARCHAR(32),
PRIMARY KEY (extendinfo_id)
);

ALTER TABLE BaseInfo ADD CONSTRAINT BaseInfo_fk0 FOREIGN KEY (extendinfo_id) REFERENCES ExtendInfo(extendinfo_id);

</pre>

擴展信息表中的主鍵ID作為基本信息表的外鍵

兩個實體類的Java代碼:

基本信息 BaseInfo

<pre>
package com.elyar.spring.entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**

  • Created by ElyarAnwar on 2017/3/7.
    */

@Entity
@Table(name = "BaseInfo")
public class BaseInfo {

@Id
@GenericGenerator(name = "uuid", strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String baseinfo_id;

</br>
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn("extendinfo_id")
private ExtendInfo extendinfo_id;
</br>
public BaseInfo() {
}
</br>
public BaseInfo(ExtendInfo extendinfo_id) {
this.extendinfo_id = extendinfo_id;
}
</br>
public String getBaseinfo_id() {
return baseinfo_id;
}
</br>
public void setBaseinfo_id(String baseinfo_id) {
this.baseinfo_id = baseinfo_id;
}
</br>
public ExtendInfo getExtendinfo_id() {
return extendinfo_id;
}
</br>
public void setExtendinfo_id(ExtendInfo extendinfo_id) {
this.extendinfo_id = extendinfo_id;
}
}
</pre>

擴展信息 ExtendInfo

<pre>
package com.elyar.spring.entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**

  • Created by ElyarAnwar on 2017/3/7.
    */
    @Entity
    @Table(name = "ExtendInfo")
    public class ExtendInfo {

    @Id
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    private String extendinfo_id;

    </br>
    // 用戶擴展信息-郵箱
    private String extendinfo_email;
    </br>
    // 用戶擴展信息-微博
    private String extendinfo_weibo;
    </br>
    // 用戶擴展信息-QQ
    private String extendinfo_qq;
    </br>
    // 用戶擴展信息-微信
    private String extendinfo_wechat;
    </br>
    public ExtendInfo() {
    }
    </br>
    public ExtendInfo(String extendinfo_email, String extendinfo_weibo, String extendinfo_qq, String extendinfo_wechat) {
    this.extendinfo_email = extendinfo_email;
    this.extendinfo_weibo = extendinfo_weibo;
    this.extendinfo_qq = extendinfo_qq;
    this.extendinfo_wechat = extendinfo_wechat;
    }
    </br>
    public String getExtendinfo_id() {
    return extendinfo_id;
    }
    </br>
    public void setExtendinfo_id(String extendinfo_id) {
    this.extendinfo_id = extendinfo_id;
    }
    </br>
    public String getExtendinfo_email() {
    return extendinfo_email;
    }
    </br>
    public void setExtendinfo_email(String extendinfo_email) {
    this.extendinfo_email = extendinfo_email;
    }
    </br>
    public String getExtendinfo_weibo() {
    return extendinfo_weibo;
    }
    </br>
    public void setExtendinfo_weibo(String extendinfo_weibo) {
    this.extendinfo_weibo = extendinfo_weibo;
    }
    </br>
    public String getExtendinfo_qq() {
    return extendinfo_qq;
    }
    </br>
    public void setExtendinfo_qq(String extendinfo_qq) {
    this.extendinfo_qq = extendinfo_qq;
    }
    </br>
    public String getExtendinfo_wechat() {
    return extendinfo_wechat;
    }
    </br>
    public void setExtendinfo_wechat(String extendinfo_wechat) {
    this.extendinfo_wechat = extendinfo_wechat;
    }
    }
    </pre>

測試:

<pre>
package com.elyar.spring.test;

import com.elyar.spring.entity.BaseInfo;
import com.elyar.spring.entity.ExtendInfo;
import com.elyar.spring.entity.UserBaseInfo;
import com.elyar.spring.entity.UserExtedInfo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/***
*** Created by ElyarAnwar on 2017/2/28.
****/
public class Test {
</br>
private ApplicationContext applicationContext;
</br>
@org.junit.Test
public void test() {
</br>
applicationContext = new ClassPathXmlApplicationContext("config/applicationContext.xml");
SessionFactory sessionFactory = applicationContext.getBean(SessionFactory.class);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
</br>
BaseInfo baseInfo = new BaseInfo();
</br>
ExtendInfo extendInfo = new ExtendInfo();
extendInfo.setExtendinfo_email("1389****061@163.com");
extendInfo.setExtendinfo_qq("734****82");
extendInfo.setExtendinfo_weibo("扔物線的軌跡");
extendInfo.setExtendinfo_wechat("1389****061");
</br>
baseInfo.setExtendinfo_id(extendInfo);
</br>
session.save(baseInfo);
transaction.commit();
}

}

</pre>

因為我們在BeasInfo中設置了@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
級聯所有操作,所以只需保存BaseInfo即可,不然需要保存BaseInfo和ExtendInfo。

現在來看看數據庫的變化吧:

BaseInfo Table
ExtendInfo Table

可以看到ExtendInfo表中的主鍵ID和BaseInfo表中的extendinfo_id是一 一 對應的。

至此完成了用戶基本信息和擴展信息的映射。

如有問題請私信。轉載請注明出處:http://www.lxweimin.com/u/1c0e16576578 ElyarAnwar 分享是最好的記憶

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,633評論 0 4
  • 本文中我們介紹并比較兩種最流行的開源持久框架:iBATIS和Hibernate,我們還會討論到Java Persi...
    大同若魚閱讀 4,336評論 4 27
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • 13年,我剛進入大學不久的某一天,我在本子上問自己:“我到底是變得更好了,還是更差了?那些好的感覺,會不會像高考時...
    綠楊寒輕閱讀 212評論 0 0