日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复合主键@IdClass

發布時間:2025/1/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复合主键@IdClass 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時一個實體的主鍵可能同時為多個,例如同樣是之前使用的“CustomerEO”實體,需要通過nameemail來查找指定實體,當且僅當nameemail的值完全相同時,才認為是相同的實體對象。要配置這樣的復合主鍵,步驟如以下所示。

1)編寫一個復合主鍵的類CustomerPK,代碼如下。

CustomerPK.java

import java.io.Serializable;

?

public class CustomerPK?implements Serializable?{

?

?????????public CustomerPK() {

?

?????????}

?

?????????public CustomerPK(String name, String email) {

???????????????????this.name = name;

???????????????????this.email = email;

?????????}

?

?????????private String email;

?

?????????public String getEmail() {

???????????????????return email;

?????????}

?

?????????public void setEmail(String email) {

???????????????????this.email = email;

?????????}

?

?????????private String name;

?

?????????public String getName() {

???????????????????return name;

?????????}

?

?????????public void setName(String name) {

???????????????????this.name = name;

?????????}

?

?????????@Override

?????????public int hashCode() {

???????????????????final int PRIME = 31;

???????????????????int result = 1;

???????????????????result = PRIME * result + ((email == null) ? 0 : email.hashCode());

???????????????????result = PRIME * result + ((name == null) ? 0 : name.hashCode());

???????????????????return result;

?????????}

?

?????????@Override

?????????public boolean equals(Object obj) {

???????????????????if (this == obj)

????????????????????????????return true;

???????????????????if (obj == null)

????????????????????????????return false;

???????????????????if (getClass() != obj.getClass())

????????????????????????????return false;

???????????????????final CustomerPK other = (CustomerPK) obj;

???????????????????if (email == null) {

????????????????????????????if (other.email != null)

?????????????????????????????????????return false;

???????????????????} else if (!email.equals(other.email))

????????????????????????????return false;

???????????????????if (name == null) {

????????????????????????????if (other.name != null)

?????????????????????????????????????return false;

???????????????????} else if (!name.equals(other.name))

????????????????????????????return false;

???????????????????return true;

?????????}

?

}

作為符合主鍵類,要滿足以下幾點要求。

l?????????必須實現Serializable接口。

l?????????必須有默認的public無參數的構造方法。

l?????????必須覆蓋equalshashCode方法。equals方法用于判斷兩個對象是否相同,EntityManger通過find方法來查找Entity時,是根據equals的返回值來判斷的。本例中,只有對象的nameemail值完全相同時或同一個對象時則返回true,否則返回falsehashCode方法返回當前對象的哈希碼,生成的hashCode相同的概率越小越好,算法可以進行優化。

2)通過@IdClass注釋在實體中標注復合主鍵,實體代碼如下。

@Entity

@Table(name = "customer")

@IdClass(CustomerPK.class)

public class CustomerEO implements java.io.Serializable {

?

?????????private Integer id;

?

?????????public Integer getId() {

???????????????????return this.id;

?????????}

?

?????????public void setId(Integer id) {

???????????????????this.id = id;

?????????}

????????

?????????private String name;

?

@Id

?????????public String getName() {

???????????????????return this.name;

?????????}

?

?????????public void setName(String name) {

???????????????????this.name = name;

?????????}

????????

?????????private String email;

@Id

?????????public String getEmail() {

???????????????????return email;

?????????}

?

?????????public void setEmail(String email) {

???????????????????this.email = email;

?????????}

}

標注復合主鍵時需要注意以下幾個問題。

l?????????@IdClass標注用于標注實體所使用主鍵規則的類。它的定義如下所示。

@Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

屬性Class表示符合主鍵所使用的類,本例中使用CustomerPK這個復合主鍵類。

l?????????在實體中同時標注主鍵的屬性。本例中在emailnamegetter方法前標注@Id,表示符合主鍵使用這兩個屬性。

3)這樣定義實體的復合主鍵后,通過以下代碼便可以獲得指定的實體對象:

????CustomerPK cpk = new CustomerPK("Janet","janetvsfei@yahoo.com.cn");

????CustomerEO instance = entityManager.find(CustomerEO.class, cpk);

總結

以上是生活随笔為你收集整理的复合主键@IdClass的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。