最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId問題

 更新時間:2022年06月13日 10:28:09   作者:羅羅諾亞F  
這篇文章主要介紹了使用JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

JPA主鍵@Id,@IdClass,@Embeddable,@EmbeddedId

1、自動主鍵

默認情況下,主鍵是一個連續(xù)的64位數(shù)字(long),它由ObjectDB自動為存儲在數(shù)據(jù)庫中的每個新實體對象自動設置。

數(shù)據(jù)庫中的第一個實體對象的主鍵是1,第二個實體對象的主鍵是2等等。

當從數(shù)據(jù)庫中刪除實體對象時,主鍵值不會被回收。

一個實體的主鍵值可以通過聲明一個主鍵字段來訪問:

@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類。

4、嵌入式主鍵

表示復合主鍵的另一種方法是使用可嵌入的類:

@Entity
public class Project {
? ? @EmbeddedId ProjectId id;
}
@Embeddable
Class ProjectId {
? ? int departmentId;
? ? long projectId;
}

主鍵字段是在可嵌入類中定義的。

該實體包含一個單獨的主鍵字段,該字段用@EmbeddedId 注釋,并包含一個可嵌入類的實例。

當使用這個表單時,沒有定義一個單獨的ID類,因為可嵌入的類本身可以表示完整的主鍵值。

@EmbeddedId和@IdClass的區(qū)別

@idClass

使復合主鍵類成為非嵌入類,使用 @IdClass 批注為實體指定一個復合主鍵類(通常由兩個或更多基元類型或 JDK 對象類型組成)。從原有數(shù)據(jù)庫映射時(此時數(shù)據(jù)庫鍵由多列組成),通常將出現(xiàn)復合主鍵。

復合主鍵類具有下列特征:

  • 它是一個普通的舊式 Java 對象 (POJO) 類。
  • 它必須為 public,并且必須有一個 public 無參數(shù)構造函數(shù)。
  • 如果使用基于屬性的訪問,則主鍵類的屬性必須為 public 或 protected。
  • 它必須是可序列化的。
  • 它必須定義 equals 和 hashCode 方法。
  • 這些方法的值相等性的語義必須與鍵映射到的數(shù)據(jù)庫類型的數(shù)據(jù)庫相等性一致。
  • 它的字段或屬性的類型和名稱必須與使用 @Id 進行批注的實體主鍵字段或屬性的類型和名稱相對應。
package com.model;
import java.io.Serializable;
public class SysUserRoleId implements Serializable{?
? ? /**
? ? ?*
? ? ?*/
? ? private static final long serialVersionUID = 2606793267849167078L;
? ? private Long userId;
? ? private Long roleId;
? ? ?
? ? @Override
? ? public int hashCode(){
? ? ? ? int result = 1;
? ? ? ? result = userId.hashCode()+roleId.hashCode();
? ? ? ? return result;
? ? }
? ? ?
? ? @Override
? ? public 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;
? ? } ?
}
package com.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
??
@Entity
@Table(name="SYS_USER_ROLE")
@IdClass(SysUserRoleId.class)
public class SysUserRole {
? ? private Long userId;
? ? private Long roleId;
? ? public SysUserRole(){?
? ? }
? ? ?
? ? public SysUserRole(Long userId,Long roleId){
? ? ? ? this.userId = userId;
? ? ? ? this.roleId = roleId;
? ? }
? ? ?
? ? @Id
? ? @Column(name="user_id")
? ? public Long getUserId() {
? ? ? ? return userId;
? ? }
? ? public void setUserId(Long userId) {
? ? ? ? this.userId = userId;
? ? }
? ? ?
? ? @Id
? ? @Column(name="role_id")
? ? public Long getRoleId() {
? ? ? ? return roleId;
? ? }
? ? public void setRoleId(Long roleId) {
? ? ? ? this.roleId = roleId;
? ? }? ??
}

@EmbeddedId

使復合主鍵類成為由實體擁有的嵌入類

使用 @EmbeddedId 批注指定一個由實體擁有的可嵌入復合主鍵類(通常由兩個或更多基元類型或 JDK 對象類型組成)。從原有數(shù)據(jù)庫映射時(此時數(shù)據(jù)庫鍵由多列組成),通常將出現(xiàn)復合主鍵。

復合主鍵類具有下列特征:

  • 它是一個普通的舊式 Java 對象 (POJO) 類。
  • 它必須為 public,并且必須有一個 public 無參數(shù)構造函數(shù)。
  • 如果使用基于屬性的訪問,則主鍵類的屬性必須為 public 或 protected。
  • 它必須是可序列化的。
  • 它必須定義 equals 和 hashCode 方法。
  • 這些方法的值相等性的語義必須與鍵映射到的數(shù)據(jù)庫類型的數(shù)據(jù)庫相等性一致。
package com.model;
import java.io.Serializable;
import javax.persistence.Column;
@SuppressWarnings("serial")
public class SysOrganizationRolePKId implements Serializable{
? ? private Long organizationId;
? ? private Long roleId;
? ? ?
? ? @Column(name="organization_id")
? ? public Long getOrganizationId() {
? ? ? ? return organizationId;
? ? }
? ? public void setOrganizationId(Long organizationId) {
? ? ? ? this.organizationId = organizationId;
? ? }
? ? ?
? ? @Column(name="role_id")
? ? public Long getRoleId() {
? ? ? ? return roleId;
? ? }
? ? public void setRoleId(Long roleId) {
? ? ? ? this.roleId = roleId;
? ? }??? ?
}
package com.model;
import java.io.Serializable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
?
@Entity
@SuppressWarnings("serial")
@Table(name="SYS_ORGANIZATION_ROLE")
public class SysOrganizationRole implements Serializable{
? ? private SysOrganizationRolePKId sysOrganizationRolePKId;
?
? ? @EmbeddedId
? ? public SysOrganizationRolePKId getSysOrganizationRolePKId() {
? ? ? ? return sysOrganizationRolePKId;
? ? }
?
? ? public void setSysOrganizationRolePKId(
? ? ? ? ? ? SysOrganizationRolePKId sysOrganizationRolePKId) {
? ? ? ? this.sysOrganizationRolePKId = sysOrganizationRolePKId;
? ? }???
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 教你利用springboot集成swagger并生成接口文檔

    教你利用springboot集成swagger并生成接口文檔

    有很多小伙伴不會利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細的代碼圖文介紹及代碼示例,對不會這個方法的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解Java TCC分布式事務實現(xiàn)原理

    詳解Java TCC分布式事務實現(xiàn)原理

    這篇文章主要介紹了詳解Java TCC分布式事務實現(xiàn)原理,對分布式事務感興趣的同學,一定要看一下
    2021-04-04
  • Java聊天室之實現(xiàn)接收和發(fā)送Socket

    Java聊天室之實現(xiàn)接收和發(fā)送Socket

    這篇文章主要為大家詳細介紹了Java簡易聊天室之實現(xiàn)接收和發(fā)送Socket功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • MyBatis之一級緩存和二級緩存問題

    MyBatis之一級緩存和二級緩存問題

    這篇文章主要介紹了MyBatis之一級緩存和二級緩存問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java實現(xiàn)分布式項目搭建的方法

    java實現(xiàn)分布式項目搭建的方法

    這篇文章主要介紹了java實現(xiàn)分布式項目搭建的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解Spring系列之@ComponentScan批量注冊bean

    詳解Spring系列之@ComponentScan批量注冊bean

    本文介紹各種@ComponentScan批量掃描注冊bean的基本使用以及進階用法和@Componet及其衍生注解使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-02-02
  • 如何使用Java redis實現(xiàn)發(fā)送手機驗證碼功能

    如何使用Java redis實現(xiàn)發(fā)送手機驗證碼功能

    這篇文章主要介紹了如何使用Java redis實現(xiàn)發(fā)送手機驗證碼功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 簡單了解Spring Bean常用注解的裝配

    簡單了解Spring Bean常用注解的裝配

    這篇文章主要介紹了簡單了解Spring Bean常用注解的裝配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • .properties文件讀取及占位符${...}替換源碼解析

    .properties文件讀取及占位符${...}替換源碼解析

    本篇文章主要介紹了.properties文件讀取及占位符${...}替換源碼解析的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊管理

    AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊管理

    這篇文章主要介紹了為大家AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊管理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論

湖州市| 崇明县| 梨树县| 阿坝县| 东台市| 高平市| 庐江县| 贞丰县| 额济纳旗| 鄂温| 永康市| 巴东县| 涿鹿县| 营口市| 广丰县| 安陆市| 万盛区| 彭州市| 印江| 湘潭市| 文山县| 城固县| 肃北| 太和县| 商丘市| 永平县| 筠连县| 南乐县| 小金县| 利津县| 鹤岗市| 循化| 皋兰县| 阳山县| 山东省| 锡林郭勒盟| 北票市| 察隅县| 九寨沟县| 武宣县| 临高县|