1. 程式人生 > >使用jpa註解資料庫中的一對一關係

使用jpa註解資料庫中的一對一關係

假設應用場景如下:Node與PageServer是一對一的關係,其中,Node類對應node表如下:

CREATE TABLE `node` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

PageServer類對應page_server表如下:

CREATE TABLE `pageserver` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `node_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_reference_67` FOREIGN KEY (`node_id`) REFERENCES `node` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

兩個類分別如下:

public class Node {
private PageServer pageServer;//PageServer實體

@OneToOne(mappedBy = "node", fetch = FetchType.LAZY)
public PageServer getPageServer() {
return pageServer;
}

public void setPageServer(PageServer pageServer) {
this.pageServer = pageServer;
}

}

說明

1、該類經過簡化,沒有全部列出程式碼,在此我們只關注OneToOne註解及其屬性設定。

2、@OneToOne

@OneToOne註解指明 Node 與 PageServer 為一對一關係,@OneToOne註解有五個屬性:mappedBy、fetch、targetEntity、cascade 和 optional 。

3、mappedBy=”node”

如果兩個實體Bean是雙向一對一關聯關係,那麼使用了mappedBy的一端我們稱為關係目標方(方便起見,稱為被控方他the Owned),另一端稱之為關係擁有方(方便起見,稱為控制方 the Owner)。相應的物件稱之為被控物件和主控物件。

只有在雙向關聯時才會使用mappedBy屬性,只有OneToOne、OneToMany、ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性。

mappedBy標籤一定是定義在the owned side(被擁有方的),並指向the owning side(擁有方)的。在本例中,Node類為關係目標方,即被控物件,the Owned 端;PageServer類為關係擁有方,即主控物件, the Owner 。

mappedBy跟JoinColumn/JoinTable總是處於互斥的一方,可以理解為正是由於擁有方中有被擁有方的欄位存在,擁有方才擁有了被擁有方。mappedBy這方定義JoinColumn/JoinTable總是失效的,不會建立對應的欄位或者表。

4、fetch = FetchType.LAZY

FetchType型別的屬性。可選擇項包括:FetchType.EAGER 和FetchType.LAZY。

fetch屬性預設值是FetchType.EAGER。

FetchType.EAGER表示被控物件(本例是Node類)在主控物件載入的時候同時載入,FetchType.LAZY表示被控物件在被訪問時才載入。預設值是FetchType.LAZY。

5、targetEntity

Class型別的屬性。定義關係類的型別,預設是該成員屬性對應的類型別,所以通常不需要提供定義。

public class PageServer {
private Node node;//所屬節點

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "node_id")
@Fetch(FetchMode.JOIN)
public Node getNode() {
return this.node;
}

public void setNode(Node node) {
this.node = node;
}
}

說明

1、cascade屬性

該屬性定義類和類之間的級聯關係。定義的級聯關係將被容器視為對當前類物件及其關聯類物件採取相同的操作, 而且這種關係是遞迴呼叫的。

預設情況下,JPA 不會將任何持續性操作層疊到關聯的目標。如果希望某些或所有持續性操作層疊到關聯的目標,請將 cascade 設定為一個或多個 CascadeType 例項,其中包括:

CascadeType.ALL
針對擁有實體執行的任何持續性操作均層疊到關聯的目標。

CascadeType.MERGE
如果合併了擁有實體,則將 merge 層疊到關聯的目標。

CascadeType.PERSIST
如果持久儲存擁有實體,則將 persist 層疊到關聯的目標。

CascadeType.REFRESH
如果重新整理了擁有實體,則 refresh 為關聯的層疊目標。

CascadeType.REMOVE
如果刪除了擁有實體,則還刪除關聯的目標。

2、JoinColumn屬性

@OneToOne註釋只能確定實體與實體的關係是一對一的關係,不能指定資料庫表中的儲存的關聯欄位。所以此時要結合@JoinColumn標記來指定儲存實體關係的配置。

3、Fetch屬性

可設定以下三個值:
@Fetch(FetchMode.JOIN) 會使用left join查詢,只產生一條sql語句;
@Fetch(FetchMode.SELECT)   會產生N+1條sql語句;
@Fetch(FetchMode.SUBSELECT)  產生兩條sql語句 第二條語句使用id in (…..)查詢出所有關聯的資料。

相關推薦

使用jpa註解資料庫一對一關係

假設應用場景如下:Node與PageServer是一對一的關係,其中,Node類對應node表如下: CREATE TABLE `node` (   `id` bigint(20) NOT NULL AUTO_INCREMENT,   `name` varchar(5

Django資料庫的資料關係一對一,一對多,多對多

一對一: 一對一的關係極為一個數據僅對應一個數據,用下圖的結構圖可以幫助理解: 下面用程式碼實現一下,首先要建立工程專案如下: 接著,我們定義模型: 來到models.py檔案,建立兩個模型: from django.db import models #

eclipse使用JPA根據資料庫表自動生成註解實體類

1.連線資料庫 需要生成實體類,我們首先要先使用eclipse中的Data Source Explorer工具連線資料庫 Data Source Explorer的使用方式見我另一篇文章: 2.建立實體類 1)現在需要建立實體類的工程,點選右鍵----->prope

Hibernate使用JPA(註解)配置物件關係對映

java中註解也是一大特點,平時進行單元測試時我們用過@Test註解進行測試 JPA就是java專門針對持久層框架進行設計的一套規範 JPA:Java Persistence API,其實它也就是一堆介面,就想JDBC一樣,不同的框架只要遵循這同一套規範就可以在java環境

JPA對映關係詳細說明(一對多,多對一,一對一、多對多)、@JoinColumn、mappedBy說明

JPA中的對映關係 jpa中維護one to one ,one to many, many to one ,many to many 四種對映關係。       在每個關係中,雙方中的一方在其表中擁有連線列。那麼一方稱為所有方(owning side) 或者關係的所有者。

JPA實體類註解

decimal traints 訪問 指定時間 seq ans 之間 插入 mov @Entity   標註於實體類上,通常和@Table是結合使用的,代表是該類是實體類@Table   標註於實體類上,表示該類映射到數據庫中的表,沒有指定名稱的話就表示與數據庫中表名為該類

JDBC上關於資料庫多表操作一對多關係和多對多關係的實現方法--轉

  原文地址---- https://www.cnblogs.com/pangguoming/p/7028322.html 黑馬程式設計師 我們知道,在設計一個Java bean的時候,要把這些BEAN 的資料存放在資料庫中的表結構,然而這些資料庫中的表直接又有些特殊

MyBatis:註解簡化一對一關係

上期 註解式是真的好用! 一對一的關係:客戶擁有一張身份證,而身份證也只有一個客戶。   客戶表中有身份證的cid,可以通過這個cid匹配身份證表中的cid,拿到那個具體的身份證資訊 反之,身份證通過本身的cid匹配客戶表中的cid,以此得到客戶的資訊。  

flask連線mysql資料庫一對一,一對多,多對多的處理關係

Y18    以學生表與班級表為例,進行一對一,與一對多操作說明。 簡單部署: 1、建立flask資料夾,在資料夾中建立python檔案,命名為app,其中程式碼: from flask import Flask app = Flask(__name__) 2

django連線mysql資料庫一對一,一對多,多對多關係模型的建立

Y19   介紹如何建立各種關係的資料模型,具體實現各種功能 先配置settings.py中連線mysql資料庫:(Y12有介紹) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.m

flask一對一,一對多以及多對多關係的設定

一對多關係: class Grade(db.Model): id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),nullable=False) num = db.Column(db.Int

Java儲存資料庫時間戳和php操作資料庫時間戳的關係

一直困擾我的問題,終於得到了解決!原先以為是自己系統問題(其實也可以確定自己的系統是64位),於是利用一下程式碼測試自己的系統是不是有問題,得到的結果是沒問題的,但是就是無正確結果輸出。於是解決問題途徑是在strtotime()函式和date(format,time())函式之間徘徊。

Mybatis xml配置一對一關係association&一對多關係collection

Mybatis xml中配置一對一關係association&一對多關係collection 今天在配置一對一關係對映以及一對多關係對映的時候,把collection中應該使用的ofType配置成了javaType。並且沒有及時發現錯誤,浪費了很多時間去查詢此配置問題,特此記一筆

springboot整合jpa,在postgresql資料庫建立主鍵自增表

依賴檔案 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

資料庫】關係型資料庫實體間的關係

【資料庫】關係型資料庫中的關係 關係分類 實際應用 關係分類 在關係型資料庫中,按照x對x的分類,可以分為三種,分別為一對一、一對多、多對多。 實際應用 我使用的是MySQL的視覺化工具Workbench,在建立新的Model EER

java 物件的 一對一關係 (封裝和構造方法)

java 中物件的 一對一關係 簡單介紹: … java中物件的對應關係有很多種,比如單向一對一,雙向一對一,一對多,多對一,多對多等,其實現原理相同,接下來,我們詳解一對一關係。 說明: … 所

關係資料庫的三正規化

1、第一正規化(1NF) 在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。 所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個

業務繼承關係研究(資料庫)

情景如下:一個學員有兩類員工,老師和後勤人員.員工有id和姓名,老師還額外有個授課學科,用OO來表達如下 class Staff{ private String id; private String name; } class Teacher extends Staff{

SpringBootController以及Jpa操作資料庫的使用

常用註解 @PathVariable:獲取Url中的資料 @RequestParam: 獲取請求引數的值 @GetMapping : 組合註解,相當於@RequestMapping(method = RequestMethod.GET) @PostMappi

資料庫關係 的相關名詞

碼 = 鍵 ; 比如,一個員工的二維關係(表) , 大概這幾個屬性: 員工表:系統內標識碼,身份證號,工號,姓名,出生日期,所在部門 理論上講, 可以有三個碼,: Key1 : 系統內部標識,這個是資料庫設計時,確定的唯