1. 程式人生 > >@JoinTable和@JoinColumn

@JoinTable和@JoinColumn

在Person中對應到資料庫裡面就有一個指向Address的外來鍵.

我們也可以增加註釋指定外來鍵的列的名字,如下:

@OneToOne(cascade=CascadeType.ALL,optional=true) @JoinColumn(name="addressID")//註釋本表中指向另一個表的外來鍵。    
 public Address getAddress() {
         return address;
 }


如果我們不加的話,也是可以通過的,在JBOSS裡面,它會自動幫你生成你指向這個類的類名加上下劃線再加上id的列,也就是預設列名是:address_id.
如果是主鍵相關聯的話,那麼可以運用如下注釋

@OneToOne(cascade={CascadeType.ALL})    
@PrimaryKeyJoinColumn    
public Address getAddress( ) {
       return homeAddress;
}

它表示兩張表的關聯是根據兩張表的主鍵的

—————————————————————————————————————————————————————————————————————

2.person和phone的一對多單向關係:

phone中沒有特別的註釋。

person中:

@OneToMany(cascade=CascadeType.ALL)  
@JoinColumn(name
="personID")//註釋的是另一個表指向本表的外來鍵。 public List<Phone> getPhones() { return phones; }

我們可以在Person類裡面發現@JoinColumn(name="personID")
它代表是一對多,一是指類本身,多是指這個成員,也就是一個類可以對應多個成員.
在一對多裡面,無論是單向還是雙向,對映關係的維護端都是在多的那一方,也就是 Phone那裡,因為要在資料庫面表現的話,也只有讓Phone起一個指向Person的外來鍵,不可能在Person裡面指向Phone,這一點和一對一 不一樣,一對一可以在任意一方起一個外來鍵指向對方.可是一對多卻不行了

.

在這裡@JoinColumn這個註釋指的卻是在Phone裡面的外來鍵的列的名字,

它並不像在一對一里面的註釋指的是自己表裡面的外來鍵列名.這一點要特別注意一下.


如果是一對多的雙向關係,那麼這個註釋就要應用到多的那邊去了,雖然註釋還在Person類裡面,但是它起的效果卻是在Phone裡面起一個叫personID的外來鍵, 因為多的那邊要有外來鍵指向少的這邊.
如果你不加 @JoinColumn(name="personID")這個註釋的話,那麼JBOSS就會自動幫你生成一張中間表,

它負現Person和Phone表之間的聯絡.它將會做如下事情:

複製程式碼
CREATE TABLE
    PERSON_PHONE
    (
        PERSON_id INT,
        PHONE_id INT
    );
ALTER TABLE
    PERSON_PHONE ADDCONSTRAINT person_phone_unique UNIQUE (PHONE_id);
ALTER TABLE
    PERSON_PHONE ADDCONSTRAINT personREFphone FOREIGNKEY (PERSON_id) REFERENCES PERSON (id);
ALTER TABLE
    PERSON_PHONE ADDCONSTRAINT personREFphone2 FOREIGNKEY (PHONE_id) REFERENCES PHONE (id);    
複製程式碼 所以我們最好還是指定一下,以讓程式產生更加確定的行為,不過一般是推薦另外生成一 箇中間表好一些,因為這樣的話,對原來兩張表的結構不對造成任何影響。在遺留系統的時候很多用,有些時候,一些表都是以前就建好了的,要改表的結構是不太 可能的,所以這個時候中間的表就顯得很重要了,它可以在不侵入原來表的情況下構建出一種更清淅更易管理的關係。

所以一對多的單向關聯,我們還是推薦使用一張中間表來建立關係。

-----------------------------------------------------------------------------------------------------------------------------------

3.person和country的多對一單向關係:

country中無特別的註解。

而person註解如下:

@ManyToOne  @JoinColumn(name="countryID")      
public Country getCountry() {
          return country;      
} 

 在一對多一對多一對的關係裡面,關係的維護端都是在多的那一面,多的一面為主控方,擁有指向對方的外來鍵。

因為主控端是Person .外來鍵也是建在Person上面,因為它是多的一面。當然我們在這裡也可以省掉@JoinColumn,那樣的話會怎麼樣呢,會不會像一對多單向一樣生成中間的表呢?事實是不會的,在這裡如果我們去掉@JoinColumn的話,那麼一樣會在Person表裡面生成一列指向

Country的外來鍵,這一點和一對多的單向是不一樣,在一對多的單向裡面,如果我們不在Person 裡面加上@JoinColumn這個註釋,那麼JBOSS將會為我們生成一箇中間的表,這個表會有一個列指向Person主鍵,一個列指向Phone主鍵。所以說為了程式有一定的行為,有些東西我們還是不要省的好。
其實多對一單向是有點向一對一單向的,在主控端裡面,也就是從Person的角度來看,也就是對應了一個Country而已,只不過這個Country是很多Person所共用的,而一對一卻沒有這一點限制。

------------------------------------------------------------

4.person和project的多對多單向關係:

project沒有特殊的註解。

person:

@ManyToMany
 public List<Project> getProjects() {
     return projects;     
 }

它需要設定中間表來維護關係,在資料庫上跟多對多雙向,只不過在程式設計的邏輯中不一樣而已。

//類似這個:@JoinTable(name = "PersonANDFlight", joinColumns ={@JoinColumn(name = "personID")}, 
//inverseJoinColumns = {@JoinColumn(name = "flightID")})

其實這個宣告不是必要的,當我們不用@JoinTable來宣告的時候,JBOSS也會為我們自動生成一個連線用的表,

表名預設是主控端的表名加上下劃線"_"再加上反轉端的表名.

類似

複製程式碼
@ManyToMany(cascade = CascadeType.ALL)      
@JoinTable(name = "PersonANDFlight", 
        joinColumns = {@JoinColumn(name = "personID")}, 
        inverseJoinColumns = {@JoinColumn(name = "flightID")})      
public List<Flight> getFlights() {
          return flights;     
 }
複製程式碼

-----------------------------------------------------

在單向關係中沒有mappedBy,主控方相當於擁有指向另一方的外來鍵的一方。
1.一對一和多對一的@JoinColumn註解的都是在“主控方”,都是本表指向外表的外來鍵名稱。
2.一對多的@JoinColumn註解在“被控方”,即一的一方,指的是外表中指向本表的外來鍵名稱。
3.多對多中,joinColumns寫的都是本表在中間表的外來鍵名稱,
  inverseJoinColumns寫的是另一個表在中間表的外來鍵名稱。

相關推薦

@JoinTable@JoinColumn

在Person中對應到資料庫裡面就有一個指向Address的外來鍵. 我們也可以增加註釋指定外來鍵的列的名字,如下: @OneToOne(cascade=CascadeType.ALL,optional=true) @JoinColumn(name="addressID")//註釋本表中指向另一個表的外來

JPA中@JoinTable@JoinColumn註解的使用

預設情況下,JPA 持續性提供程式在對映多對多關聯(或在單向的一對多關聯中)的擁有方上的實體關聯時使用一個連線表。連線表名稱及其列名均在預設情況下指定,且 JPA 持續性提供程式假設:在關係的擁有方上的實體主表中,每個主鍵列有一個連線列。 通過表關聯的方式來對映一對多或

@OneToMany,@ManyToOne 中 @mappedby @joincolumn 用法解釋

/** * 建立了一個實體類。 * * 如何持久化呢? * * 1、使用@Entity進行實體類的持久化操作,當JPA檢測到我們的實體類當中有 * * @Entity 註解的時候,會在資料庫中生成對應的表結構資訊。 * * * 如何指定主鍵以及主鍵的生成策略? *

Hibernate中,mappedBy註解@JoinColumn的對比

mappedBy 我們知道,mappedBy用於指定具有雙向關係的兩個實體中。哪個實體是被關聯處理的。它有如下四個特點: 1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性; [email&#

Reduce Transduce 的含義

span 開發 opera clas 當前 form 基本功 通過 handle 一、reduce 的用法 reduce是一種數組運算,通常用於將數組的所有成員"累積"為一個值。 var arr = [1, 2, 3, 4]; var sum = (a, b) =&g

7.Spring切入點的表達式通知類型

ice span rac 後置 owin err logs 異常 環繞 1.切入點的表達式 表達式格式: execution([修飾符] 返回值類型 包名.類名.方法名(參數)) 其他的代替: <!-- 完全指定一個方法 --> <!-- <a

關於CUDA兩種API:Runtime API Driver API

ive uda ++ etime bsp con spa runt cuda CUDA 眼下有兩種不同的 API:Runtime API 和 Driver API,兩種 API 各有其適用的範圍。高級API(cuda_runtime.h)是一種C

數據結構--Avl樹的創建,插入的遞歸版本非遞歸版本,刪除等操作

pop end eem static cout 遞歸 sta div else AVL樹本質上還是一棵二叉搜索樹,它的特點是: 1.本身首先是一棵二叉搜索樹。 2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值最多為1(空樹的高度為-1)。 也就是說,AV

函數模版主函數分別在.h .cpp中(要包含.cpp)

spa end pragma test ios his 函數 private () Complex.h #pragma once #include<iostream> using namespace std;//這句還必須加,要不然致錯,不懂為啥呢 te

mybatis強化(二)ParametersResult

pan har java onf 關系 throws efault type throw 本文通過一個簡單例子簡單記錄下參數的映射。轉載註明出處:http://www.cnblogs.com/wdfwolf3/p/6804243.html,謝謝。文件目錄如下, 1.配置文

典型用戶場景

目的 本科 查看 如何 表格 自己 服務 表示 用戶 分析我們psp表的典型用戶和場景 老師: (1)姓名:王建民 (2)年齡:35 (3)收入:不詳 (4)代表的用戶在市場上的比例和重要性:我們軟件針對於信息學院學生,比例大概為1:200,老師是檢查學生能力的人員,是不可

五.目錄,文件的瀏覽,管理維護

linux文件系統 維護 結構 mkdir 硬件 配置文件 查看 路徑 目錄 一.linux文件系統的層次結構: a)在linux中,所有的文件和目錄都被組織成一個由一個根結點的樹狀結構,如 mkdir -p /a/b/c/d ,用tree 命令查看能直觀顯示目錄的結構為樹

xubuntu 17.04 iphone 6互傳文件方法——使用libimobiledevice就可以像u盤一樣操作文件了

ges this med ipo val apt app edev pair I need to preface this by saying I‘m also new to Linux, but I‘ve got it working I think. The inst

[開機啟動]Linux開機自啟運行級別

時也 logs 狀態 service devel bat syslogd 其它 沒有 嵌入式系統中程序自啟動方法 在很多嵌入式系統中,由於可用資源較少,常常在系統啟動後就直接讓應用程序自動啟動,以減少用戶操作和節省資源。如何讓自己的應用程序自動啟動呢? 在Linux系

典型用戶典型用戶場景

天都 占比 職業 日常 手機 學生 能力 事情 什麽 典型用戶和典型用戶場景: 典型用戶1: (1)姓名:李麗 (2)性別、職業:女,基教清潔工 (3)知識層次和能力:初中水平,可以使用智能手機,使用各種軟件 (4)生活/工作情況:作為清潔工,經常往返於各個樓層 (5)代

典型用戶場景分析

水平 用途 環境 大學生 空間 黑板 層次 重要性 可能 1. 名字:韓梅梅 年齡:39 職業:食堂阿姨 代表的用戶在市場上的比例和重要性:5% 較重要 知識層次和能力:可能不太會熟練使用手機APP 使用本軟件的環境:食堂或其他地方 典型場景:食堂阿姨撿到一張飯卡,將此信

GETPOST區別總結

get 、post 、區別一、GET和POST區別的普遍看法:HTTP 定義了與服務器交互的不同方法,最常用的有4種,Get、Post、Put、Delete,如果我換一下順序就好記了,Put(增),Delete(刪),Post(改),Get(查),即增刪改查,下面簡單敘述一下:1)Get, 它用於獲取信息,註

完全備份數據差異備份數據的shell腳本

完全備份數據和差異備份數據的shell腳本#!/bin/bash # # Description: 該腳本功能,以周為單位循環;周五實行完全備份,周六不備份,周日至周四實行差異備份; # 因工作需要,不實行壓縮打包的方式,采用cp完全備份,rsync差異備份; #

python基礎:循環語句判斷語句

python 語句 循環 判斷 小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------謝謝您的參考,如有疑問,歡迎交流一、 python語句塊和縮進縮進是Py

Redisphpredis安裝

redis1,安裝環境centos 7.3/php 5.6.29安裝步驟:一,先安裝redis,到官網下載redis ( https://redis.io/download)二,按照官方文檔操作,最後執行make test (如果報缺少tcl的問題,安裝對應包即可)三,安裝phpredis(模塊插件)安裝PH