熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

hibernate注解實現復合主鍵

2013-11-23 20:12:57  來源: Java開源技術 

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

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

  CustomerPKjava

  import javaioSerializable;

  public class CustomerPK implements Serializable {

  public CustomerPK() {

  }

  public CustomerPK(String name String email ) {

  thisname = name;

  thisemail = email ;

  }

  private String email ;

  public String getEmail () {

  return email ;

  }

  public void setEmail (String email ) {

  thisemail = email ;

  }

  private String name;

  public String getName() {

  return name;

  }

  public void setName(String name) {

  thisname = name;

  }

  @Override

  public int hashCode() {

  final int PRIME = ;

  int result = ;

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

  result = PRIME * result + ((name == null ) ?  : namehashCode());

  return result;

  }

  @Override

  public boolean equals(Object obj) {

  if (this == obj)

  return true;

  if (obj == null )

  return false;

  if (getClass() != objgetClass())

  return false;

  final CustomerPK other = (CustomerPK) obj;

  if (email == null ) {

  if (otheremail != null )

  return false;

  } else if (!email equals(otheremail ))

  return false;

  if (name == null ) {

  if (othername != null )

  return false;

  } else if (!nameequals(othername))

  return false;

  return true;

  }

  }

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

  l 必須實現Serializable接口

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

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

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

  @Entity

  @Table(name = customer)

  @IdClass(CustomerPKclass)

  public class CustomerEO implements javaioSerializable {

  private Integer id;

  public Integer getId() {

  return thisid;

  }

  public void setId(Integer id) {

  thisid = id;

  }

  private String name;

  @Id

  public String getName() {

  return thisname;

  }

  public void setName(String name) {

  thisname = name;

  }

  private String email ;

  @Id

  public String getEmail () {

  return email ;

  }

  public void setEmail (String email ) {

  thisemail = email ;

  }

  }

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

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

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

  public @interface IdClass {

  Class value();

  }

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

  l 在實體中同時標注主鍵的屬性本例中在email和name的getter方法前標注@Id表示符合主鍵使用這兩個屬性

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

  CustomerPK cpk = new CustomerPK(Janetcn);

  CustomerEO instance = entityManagerfind(CustomerEOclass cpk);


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28128.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.