1. 程式人生 > >Hibernate一對一主鍵關聯(基於annotation註解方式)

Hibernate一對一主鍵關聯(基於annotation註解方式)

 hibernate中一對一的關聯有兩種方式:一種是採用外來鍵關聯,另外一種是採用主鍵關聯。

 最近專案中用到一對一主鍵雙向關聯,並且是基於註解的方式。期間遇到一些問題,現在貼出來探討探討。

 一個丈夫(husband)對應一個妻子(wife),主要目標是在儲存丈夫或者妻子時,關聯的物件也被儲存。具體程式碼如下:

 husband類: 

package cn.edu.dlnu.resources.model.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
public class Husband {
 private int id;
 private String name;
 private Wife wife;
 @Id
 @GeneratedValue//主鍵生成器

 public int getId(){
  return id;
 }
 public String getName() {
  return name;
 }
@OneToOne(cascade=CascadeType.ALL)
 @PrimaryKeyJoinColumn//這個註解只能寫在主(生成ID)的一端

 public Wife getWife() {
  return wife;
 }
 public void setId(int id) {
  this.id = id;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void setWife(Wife wife) {
  this.wife = wife;
 }
}
 wife類:

package cn.edu.dlnu.resources.model.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
public class Wife {
 private int id;
 private String name;
 private Husband husband;
 
 @Id
 @GenericGenerator(name="pkGenerator",strategy="foreign",parameters={@Parameter(name="property",value="husband")})
   @GeneratedValue(generator="pkGenerator")

//wife的ID是根據husband的ID來賦值的,這裡需要設定ID生成器的策略為foreign,引數中指定wife的ID是使用husband物件中的ID
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void setHusband(Husband husband) {
  this.husband = husband;
 }
 @OneToOne(cascade=CascadeType.ALL,mappedBy="wife")

 public Husband getHusband() {
  return husband;
 }
}
 OneToOnePKTest類:

package cn.edu.dlnu.resources.model.entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import cn.edu.dlnu.resources.model.entity.Husband;
import cn.edu.dlnu.resources.model.entity.Wife;

public class OneToOnePKTest {
 private static SessionFactorysessionFactory;
 
 @BeforeClass
 public static void beforeClass() {
   sessionFactory= newAnnotationConfiguration().configure().buildSessionFactory();
 }
 @AfterClass
 public static void afterClass() {
  sessionFactory.close();
 }
 
 @Test
 public void testSave(){
  Session s =sessionFactory.getCurrentSession();
  s.beginTransaction();
  
  Husband h = newHusband();
  Wife w = new Wife();
  w.setName("w");
  h.setName("h");


  h.setWife(w);
  w.setHusband(h);
  s.save(w);
  s.getTransaction().commit();
 }

@Test
 public void testSchemaExport() {
  new SchemaExport(newAnnotationConfiguration().configure()).create(false, true);
 }
 public static void main(String[] args) {
  beforeClass();
  newOneToOnePKTest().testSave();
  afterClass();
 }
}

hibernate生成的資料庫表:create table Husband (
       id integer not null auto_increment,
       name varchar(255),
       primary key (id)
    );

create table Wife (
       id integer not null,
       name varchar(255),
       primary key (id)
    )
執行testSave(),方法後資料庫中husband 與 wife表中記錄的主鍵一致。

相關推薦

Hibernate一對一關聯基於annotation註解方式)

 hibernate中一對一的關聯有兩種方式:一種是採用外來鍵關聯,另外一種是採用主鍵關聯。  最近專案中用到一對一主鍵雙向關聯,並且是基於註解的方式。期間遇到一些問題,現在貼出來探討探討。  一個丈夫(husband)對應一個妻子(wife),主要目標是在儲存丈夫或者妻子

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

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

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

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

Hibernate,關系映射的多對一單向關聯、多對一雙向關聯一對一關聯一對一關聯、多對多關系關聯

nat 延遲加載 alt ima orm 雙向關聯 映射文件 結構 spa 2018-11-10 22:27:02開始寫 下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構: 下圖內容hibernate映射文件結構介紹

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

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

Hibernate 一對一關聯對映關聯VS唯一外來關聯

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

Hibernate 對映關係 ---One2One 關聯

1.One2One 主鍵單向關聯 兩個實體id保持相同,可避免多餘欄位建立 維護方 主鍵 採用foreign 生成器,並且使用one-to-one 標籤 constrained只能在one-to-one的對映中使用,(一般在主表的對映中,有外來鍵的那個表)。如果co

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

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

hibernate5(13)註解對映[5]一對一共享關聯

一對一共享主鍵 下面我們直接通過例項來講解共享主鍵配置: 主鍵主控方:Article package com.zeng2.model; @Table(name = "t_article2")

Hibernate初學者---schemaExport自動生成聯合關聯資料表

Hibernate 版本: v5.2.10 Eclipse版本:v4.7.1 JDK版本: v1.8 MySQL版本:v5.7 OPJO類一, package com.bak.bum.u

MyBatis框架基於Annotation註解一對一關聯對映

 程式碼: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PU

Hibernate生成策略小總結

rem 時間值 多線程 class 判斷 acl 選擇 hiberna bsp 主鍵生成策略大致分兩種: 手工控制策略 自動生成策略【框架自動生成和數據庫自動生成】 手工控制策略: assigned:類型是任意的,需要在 save() 到數據庫前,編碼人員手工設置主鍵

hibernate 聯合

blog package site http Coding logs override ide pac xml配置 需要一個主鍵類: package com.bxw.entity; import java.io.Serializable; public class

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

rom 成功 查詢 content cat 回憶 target his var 在實際博客站點中,文章內容的數據量非常多,它會影響我們檢索文章其他數據的時間,如查詢公布時間、標題、類別的等。這個時候,我們能夠嘗試將文章內容存在還有一張表中,然後建立起文章

Hibernate各種生成策略與配置詳解

文檔 最簡 重啟 如果 自定義 早期 出錯 lsp 當地時間 1、assigned 主鍵由外部程序負責生成,在 save() 之前必須指定一個。Hibernate不負責維護主鍵生成。與Hibernate和底層數據庫都無關,可以跨數據庫。在存儲對象前,必須要使用主鍵的sett

Hibernate 組合的使用

div too pri code onetoone vat embedded ble clas 使用@Embeddable註解,組合鍵的類必須實現 Serializable 接口 @Data @Embeddable public class UserCommentId i

mongoose 關聯的表,自動帶出另一張表的資料

  有這樣兩張表 addon_passwordbox_category 'use strict' var mongoose = require('mongoose'), Schema = mongoose.Schema /*** * 加密後的密碼錶 *2018年

mysql資料庫根據關聯更新指定欄位值

需求: 現有兩個表分別為 person_info2  和 person_info ,person_info2 表資料不變,當person_info2表中的主鍵和person_info2 表的主鍵相同時,則更新person_info2 表中其他欄位更新為per

hibernate 聯合出現MySQLIntegrityConstraintViolationException錯誤

問題 今天在使用SSH框架做一個專案中的級聯插入時,報一個錯誤(root error,其他錯誤很多,不過都是因為這個引起)“com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExce

hibernate生成器以及 hibernateutil工具類

一. hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生成唯一的標識 。 1.1 程式設計師自己控制:assigned 資料型別不限、儲存前必須賦值 1.2 資料庫控制: mysql:identity(