天天看點

Jpa 主鍵@Id @IdClass 以及 @EmbeddedId和@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類。

轉發:https://blog.csdn.net/tracycater/article/details/78319021

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

@EmbeddedId和@idClass的差別

@idClass

使複合主鍵類成為非嵌入類,使用 

@IdClass

 批注為實體指定一個複合主鍵類(通常由兩個或更多基元類型或 JDK 對象類型組成)。從原有資料庫映射時(此時資料庫鍵由多列組成),通常将出現複合主鍵。

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

  • 它是一個普通的舊式 Java 對象 (POJO) 類。
  • 它必須為 public,并且必須有一個 public 無參數構造函數。
  • 如果使用基于屬性的通路,則主鍵類的屬性必須為 public 或 protected。
  • 它必須是可序列化的。
  • 它必須定義 

    equals

     和 

    hashCode

     方法。

    這些方法的值相等性的語義必須與鍵映射到的資料庫類型的資料庫相等性一緻。

  • 它的字段或屬性的類型和名稱必須與使用 @Id 進行批注的實體主鍵字段或屬性的類型和名稱相對應。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

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;

}  

}

  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

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 對象類型組成)。從原有資料庫映射時(此時資料庫鍵由多列組成),通常将出現複合主鍵。

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

  • 它是一個普通的舊式 Java 對象 (POJO) 類。
  • 它必須為 public,并且必須有一個 public 無參數構造函數。
  • 如果使用基于屬性的通路,則主鍵類的屬性必須為 public 或 protected。
  • 它必須是可序列化的。
  • 它必須定義 

    equals

     和 

    hashCode

     方法。

    這些方法的值相等性的語義必須與鍵映射到的資料庫類型的資料庫相等性一緻。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

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;

}

}

  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

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;

}

}

  作者: lost blog

      出處: http://www.cnblogs.com/JAYIT/

     關于作者:專注伺服器端開發

繼續閱讀