1. 程式人生 > >JPA聯合主鍵的使用

JPA聯合主鍵的使用

對於絕大多數情況一個表只會有一個欄位是主鍵,但是比較特殊的情況下可能會有多個欄位一起構成主鍵,這樣的主鍵就是聯合主鍵了。下面用一個小例子來說明這個情況,我們知道飛行用的航線一般有起點和終點構成,也就是說可以根據起點和終點確定航線,這種情況聯合主鍵就能發揮它的作用了。針對這種情況我們需要把起點和終點封裝成一個物件之後作為聯合主鍵使用。

1  聯合主鍵的java類

package org.lxh.info;

import java.io.Serializable;

import javax.persistence.Embeddable;

@Embeddable
public class Destination implements Serializable{
	private String start;
	private String end;

	public String getStart() {
		return start;
	}

	public void setStart(String start) {
		this.start = start;
	}

	public String getEnd() {
		return end;
	}

	public void setEnd(String end) {
		this.end = end;
	}
}

作為聯合主鍵的這個類必須實現Serializable介面並且類的最上面還應該有@Embeddable註解

2 用於持久化的實體類

package org.lxh.info;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class AirPlanMessage {
	private Destination id;
	private String lineName;
	private String companyName;
        @EmbeddedId
	public Destination getId() {
		return id;
	}

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

	public String getLineName() {
		return lineName;
	}

	public void setLineName(String lineName) {
		this.lineName = lineName;
	}

	public String getCompanyName() {
		return companyName;
	}

	public void setCompanyName(String companyName) {
		this.companyName = companyName;
	}
}

和之前不同的是這個實體類中主鍵就不使用@Id了而是使用@EmbeddedId,加了這個註解就說明這裡的主鍵是聯合主鍵

3  資料的儲存操作

package org.lxh.test;

import static org.junit.Assert.*;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.lxh.info.AirPlanMessage;
import org.lxh.info.Destination;
import org.lxh.info.Sex;
import org.lxh.info.Student;
import org.lxh.info.Teacher;
import org.lxh.info.User;
import org.lxh.info.UserDetails;
import org.lxh.util.JpaUtil;

public class Test {

	
	@org.junit.Test
	public void testUnionPK() {
		EntityManager em=null;
		EntityTransaction tx=null;
		try{
			em=JpaUtil.getEntityManager();
			tx=em.getTransaction();
			tx.begin();
			
			Destination des=new Destination();
			des.setStart("昆明");
			des.setEnd("上海");
			
			AirPlanMessage air=new AirPlanMessage();
			air.setId(des);
			air.setLineName("昆明到上海");
			air.setCompanyName("東方航空");
			
			em.persist(air);
		    
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(em!=null){
				em.close();
			}
		}
		
	}
}

最後來看下生成的這個表的結構


相關推薦

JPA聯合的使用

對於絕大多數情況一個表只會有一個欄位是主鍵,但是比較特殊的情況下可能會有多個欄位一起構成主鍵,這樣的主鍵就是聯合主鍵了。下面用一個小例子來說明這個情況,我們知道飛行用的航線一般有起點和終點構成,也就是說可以根據起點和終點確定航線,這種情況聯合主鍵就能發揮它的作用了。針對這種

JPA 多對多關聯  中間錶帶有屬性 兩個外來作為中間表的聯合時 直接操作中間表查詢修改的方法

因為中間錶帶有屬性,採用的多對多對映方式 兩個實體類都使用   @OneToMany( mappedBy="workDateTime") 需求:因為中間表使用兩個外來鍵作為聯合主鍵 ,如果需要對中間表的屬性進行修改, 1、一般做法 從實體類獲取中間表的集合,然後遍歷

spring-data-jpa使用聯合後出現operand should contain 1 column(s)

最近做專案遇到個比較坑的地方,今天有空記錄下來,希望可以為遇到同樣情況的朋友提供一個方法。   因為業務邏輯上的問題,專案寫到前幾天突然發現要重新設計資料庫某個表的主鍵。(在團隊同學的建議下),採用了之前一直沒機會接觸過的聯合主鍵。   專案用的是mySql,資料表修改成

JPA複合另一種實現--聯合約束

前言 關於複合主鍵一般是三種方式,但必須建立複合主鍵類,然後通過註解的方式完成,這三種方式網上很容易找到,這裡主要記錄自己使用時的一些坑和專案中的特殊需求。 結合JPA使用時,關於Repository類中第二個引數不再是Long(主鍵id型別),而是複合主

springboot jpa 複合 聯合

開發十年,就只剩下這套架構體系了! >>>   

【踩坑】聯合情況下,JPA設定自動增長無效

開發十年,就只剩下這套架構體系了! >>>   

hybris items.xml 中表的聯合實現

實現 have option 字段 reat direct combined 指定 org 在 items.xsd中是這麽定義 unique的 <xs:attribute name="unique" type="xs:boolean" use="optional"&g

Oracle創建聯合

bsp font acl con pan span tex size 主鍵 先創建個表: 1)create table test ( sno char(12), name char(4), CONSTRAINT PK_TAB PRIMARY KEY (sno,

hibernate 聯合

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

hibernate MTM 聯合

hash ret hbm.xml utf oct import override 映射 ping //適用於表裏沒有其他列,只有主鍵 //Course.java實體類 package com.tao.pojo; import java.util.HashSet; imp

SQL Server(MySql)中的聯合聯合索引) 索引分析

判斷 reat 系統 lap creat insert 結果 問題 select 最近有人問到這個問題,之前也一直沒有深究聯合索引具體使用邏輯,查閱多篇文章,並經過測試,得出一些結論 測試環境:SQL Server 2008 R2 測試結果與MySql聯合索引查詢機制類似,

JPA註解生成策略-UUID

ces sys 策略 選擇 system 實現 table ont ora @GeneratedValue:主鍵的產生策略,通過strategy屬性指定。   主鍵產生策略通過GenerationType來指定。GenerationType是一個枚舉,它定義了主鍵產生策略的

函式儲存過程和聯合

建立批量插入資料 第一個命令是DELIMITER //,它與儲存過程語法無關。 DELIMITER語句將標準分隔符 - 分號(;)更改為://。 在這種情況下,分隔符從分號(;)更改為雙斜槓//。為什麼我們必須更改分隔符? 因為我們想將儲存過程作為整體傳遞給伺服器,而不是讓mysql工具一次解釋每個語句。

Oracle聯合

轉https://www.cnblogs.com/king-xg/p/6721272.html alter table tablename add constraint unionkeyname primary key (column1,column2); 上面語句中: tablename為要新增聯合

MySQL聯合自增分別產生遞增id

比如員工表,要在部門內遞增生成編號 ,例如    t_user表        dept          user_no_name --------

springboot jpa 複合

https://blog.csdn.net/wyc_cs/article/details/9031991   建立一個複合主鍵類 public class LevelPostMultiKeysClass implements Serializable{ private Integer

hibernate 聯合出現MySQLIntegrityConstraintViolationException錯誤

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

Chloe聯合查每個ID最新的資料

聯合主鍵如圖,對於一個HouseHoldID,可能對應不同的GetTime。所以一個HouseHoldID,可能有多條資料存在。 現在要查詢所有所有HouseHoldID最新時間的資料, 使用SQL語句查詢: select HouseHoldID ,max(GetTim

SQL 聯合跨表刪除最小時間那條重複資料,跨表 for UPdate

一、過濾出需要刪除的重複資料的ID select  aac001  from ei_app_recheck_citi_id inner join std_app on std_app.app_id=ei_app_recheck_citi_id.app_id where s

使用註解風格學習Hibernate和JPA生成策略

                      主鍵是關係資料庫中的一個基本概念,它用來保證記錄的唯一性。簡單來說,就是同一張資料庫表中,不允許存在多條相同主鍵的記錄。主鍵生成策略,就是當向資料庫表中插入記錄的時候,這個記錄的主鍵該如何生成。絕大部分情況下,主鍵都是沒有業務含義的,所以開發者不會、也不需要,顯示地