1. 程式人生 > >Jpa 主鍵@Id @IdClass 以及 @EmbeddedId和@idClass的區別

Jpa 主鍵@Id @IdClass 以及 @EmbeddedId和@idClass的區別

1、自動主鍵 
預設情況下,主鍵是一個連續的64位數字(long),它由ObjectDB自動為儲存在資料庫中的每個新實體物件自動設定。資料庫中的第一個實體物件的主鍵是1,第二個實體物件的主鍵是2等等。當從資料庫中刪除實體物件時,主鍵值不會被回收。 
一個實體的主鍵值可以通過宣告一個主鍵欄位來訪問:

@Entity
public class Project {
    @Id @GeneratedValue long id; // still set automatically
}

@id標註將欄位標記為一個主鍵欄位。當定義主鍵欄位時,主鍵值將被ObjectDB自動注入到該欄位中。 
@generatedvalue註釋指定主鍵是由ObjectDB自動分配的 
2、應用設定主鍵 
如果一個實體有一個沒有@generatedvalue標記的主鍵欄位,則不會生成自動主鍵值,並且應用程式負責通過初始化主鍵欄位來設定主鍵。這必須在持久化實體物件的任何嘗試之前完成。

@Entity
public class Project {
    @Id long id; // must be initialized by the application
}

應用程式設定的主鍵欄位可以有以下型別: 
● 原始型別: boolean, byte, short, char, int, long, float, double. 
● java.lang包中的包裝型別:Byte, Short, Character, Integer, Long, Float, Double. 
● java.math.BigInteger, java.math.BigDecimal. 
● java.lang.String. 
● java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp. 
● 列舉型別 
● 引用一個實體物件 
3、複合主鍵 
複合主鍵由多個主鍵欄位組成。每個主鍵欄位必須是上面列出的支援型別之一。 
例如,以下專案實體類的主鍵由兩個欄位組成:

@Entity @IdClass(ProjectId.class)
public class Project {
    @Id int departmentId;
    @Id long projectId;
}

當一個實體有多個主鍵欄位時,JPA需要定義一個特殊的ID類,該類是使用@idclass註釋附加到實體類的。ID類反映了主鍵欄位,它的物件可以表示主鍵值:

Class ProjectId {
    int departmentId;
    long projectId;
}

ObjectDB不強制定義ID類。但是,如果實體物件必須按照檢索實體部分中所示的主鍵來檢索實體物件,那麼就需要ID類。

================================================================================================

@idClass

使複合主鍵類成為非嵌入類,使用 @IdClass 批註為實體指定一個複合主鍵類(通常由兩個或更多基元型別或 JDK 物件型別組成)。從原有資料庫對映時(此時資料庫鍵由多列組成),通常將出現複合主鍵。

複合主鍵類具有下列特徵:

  • 它是一個普通的舊式 Java 物件 (POJO) 類。

  • 它必須為 public,並且必須有一個 public 無引數建構函式。

  • 如果使用基於屬性的訪問,則主鍵類的屬性必須為 public 或 protected。

  • 它必須是可序列化的。

  • 它必須定義 equals 和 hashCode 方法。

    這些方法的值相等性的語義必須與鍵對映到的資料庫型別的資料庫相等性一致。

  • 它的欄位或屬性的型別和名稱必須與使用 @Id 進行批註的實體主鍵欄位或屬性的型別和名稱相對應。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859package com.model;import java.io.Serializable;public class SysUserRoleId implements Serializable{/****/private static final long serialVersionUID = 2606793267849167078L;private Long userId;private Long roleId;@Overridepublic int hashCode(){int result = 1;result = userId.hashCode()+roleId.hashCode();return result;}@Overridepublic boolean equals(Object obj){if(obj == null){return false;}if(this == obj){return true;}if(getClass() != obj.getClass()){return false;}final SysUserRoleId other = (SysUserRoleId) obj;if(other.getUserId().equals(this.userId) && other.getRoleId().equals(this.roleId)){return true;}return false;}public Long getUserId() {return userId;}public void setUserId(Long userId) {this.userId = userId;}public Long getRoleId() {return roleId;}public void setRoleId(Long roleId) {this.roleId = roleId;}  }
1234567891011121314151617181920212223242526272829303132333435363738394041424344package 

相關推薦

Jpa @Id @IdClass 以及 @EmbeddedId@idClass區別

1、自動主鍵 預設情況下,主鍵是一個連續的64位數字(long),它由ObjectDB自動為儲存在資料庫中的每個新實體物件自動設定。資料庫中的第一個實體物件的主鍵是1,第二個實體物件的主鍵是2等等。當從資料庫中刪除實體物件時,主鍵值不會被回收。 一個實體的主鍵值可以通過宣告一

JPA @Id、@IdClass、@Embeddable、@EmbeddedId

1、自動主鍵 預設情況下,主鍵是一個連續的64位數字(long),它由ObjectDB自動為儲存在資料庫中的每個新實體物件自動設定。資料庫中的第一個實體物件的主鍵是1,第二個實體物件的主鍵是2等等。當從資料庫中刪除實體物件時,主鍵值不會被回收。 一個實體的主

MySQL自動生成生成器表以及JPA對映

MySQL主鍵自動生成 表設計 MySQL有許多主鍵生成策略,其中很常見的一種是自動生成。一般情況下,主鍵型別是BIGINT UNSIGNED,自動生成主鍵的關鍵詞是AUTO_INCREMENT。 C

MyBatis的sql對映檔案(CRUDid生成)

一個好的講解mybatis的部落格地址http://www.jianshu.com/nb/5226994 官方文件:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html Mapper XML 檔案 MyBatis 的真正強大在於它的對映語

Navicat操作Oracle、JPA註解實現Oracle插入資料 ID自增

首先在Oracle表中實現ID自增,其次在JPA中實現。 Oracle資料庫不存在主鍵自增選項,現在想實現ID自增。 部落格連結:oracle 實現插入自增列   開啟Navicat,定位到自己建立的表。 一、 建立序列 其他-序列&

Spring boot JPA 用自定義策略 生成自定義ID

最近學習Spring boot 處理資料庫主鍵時JPA 1 package javax.persistence; 2 3 public enum GenerationType { 4 TABLE, 5 SEQUENCE, 6 IDENTITY,

mybatis單條批量插入返回插入成功後的id

有些時候我們在新增記錄成功後希望能直接獲取到該記錄的主鍵id值,而不需要再執行一次查詢操作。在使用mybatis作為ORM元件時,可以很方便地達到這個目的。鑑於mybatis目前已經支援xml配置和註解2種方式,所以分別給予詳細介紹。使用xml配置方式1.xml配置:<!-- 插入資料:返回記錄的id值

[python]利用uuidbase64實現資源id

不想用mysql的自增id(造資料的時候會很麻煩),而且tiDB也不支援. 而且主鍵希望和資源的業務屬性是可對應的. 比如裝置就是域+ip,這樣如果刪除了再新增,主鍵不會改變. 直接用uuid3,32位元組的字串有點太長,16byte的bytes操作又麻煩, 128bi

使用mybatis插入自增ID的數據後返回自增的ID

配置 map batis 對象 insert語句 parameter 用戶註冊 class domain 在開發中碰到用戶註冊的功能需要用到用戶ID,但是用戶ID是數據庫自增生成的,這種情況上網查詢後使用下面的方式配置mybatis的insert語句可以解決: 1 <

ibatis annotations 註解方式返回剛插入的自增長ID的值--轉

ice summary use 文件的 per 自動 問答 ner generate 原文地址:http://www.blogs8.cn/posts/WWpt35l mybatis提供了註解方式編寫sql,省去了配置並編寫xml mapper文件的麻煩,今天遇到了獲取自增

mybatis 針對SQL Server 的 id生成策略

pwd create 映射 mapper lec ted div 策略 wrong SQL Server中命令: select newId() ,可以得到SQL server數據庫原生的UUID值,因此我們可以將這條指令寫到 Mybatis的主鍵生成策略配置sele

關聯非id時-hbm.xml配置,及其分頁查詢DaoImpl

foreign opp style area ringbuf ber getc ram n-k 表關聯時,外鍵關聯非主鍵id時-hbm.xml配置: (由於hibernate默認為關聯主鍵查詢,故需要配置相關hql語句的屬性) <many-to-one name=

Oracle 在函數或存儲過程中執行一條插入語句並返回ID

num c# 如果 acl get col oracle style 建表語句 有時,我們需要往一張表插入一條記錄,同時返回主鍵ID值。 假定主鍵ID的值都是通過對應表的SEQUENCE來獲得,然後進行ID賦值 這裏有幾種情況需要註意: 1)如果建表語句含有主鍵ID的觸發器

spring jdbcTemplate insert插入Oracle數據庫後返回當前id

spring bsp java ntc oracl statement ava head ora 最近做一個spring版本3.0.4的老項目功能,應用場景要用到jdbctemplate插入oracle表後返回主鍵ID拿來和其他表關聯。 用oralce的可以一直用這種處理

Yii2返回以id名的數組

mode checkbox mar images his use group orm textinput branch.php <?php namespace app\models; use Yii; /** * This is the model clas

mybatis添加記錄時返回id

測試數據 image creat ger org 設計 efault 需要 generated 參考:https://www.cnblogs.com/nuccch/p/7687281.html 場景 有些時候我們在添加記錄成功後希望能直接獲取到該記錄的主鍵id值,而不需要

oracle數據庫中為已經存在表的ID設置自增

oracle數據庫中為已經存在表的主鍵I創建一張表 create table t_(user_id number not null primary key,user_name varchar2(30),credits number,user_password varchar2(32),last_visit

Mybatis+Mysql插入數據庫返回自增id值的三種方法

文章 param mysql int sta source nbsp 通用 映射 一、場景: 插入數據庫的值需要立即得到返回的主鍵id進行下一步程序操作 二、解決方法: 第一種:使用通用mapper的插入方法 Mapper.insertSelective(r

Mybatis 在 insert 之後想獲取自增的 id,但是總是返回1

代碼 true batis id屬性 說明 _id reg generated color 記錄一次傻逼的問題, 自己把自己蠢哭:Mybatis 在 insert 之後想獲取自增的主鍵 id,但是總是返回1 錯誤說明:   返回的1是影響的行數,並不是自增的主鍵id

Mybatis 在 insert 之後想獲取自增的 id

type rop ati property prope keys .get clas gist <insert id="add" useGeneratedKeys="true" keyColumn="id" keyProperty="id"