程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Hibernate Annotations維護多對多關系的心得

使用Hibernate Annotations維護多對多關系的心得

編輯:關於JAVA

說明

在HibernateAnnotations中通過@ManyToMany注解可定義多對多關聯。同時,也需要通過注解@JoinTable描述關聯表和關聯條件。對於雙向關聯,其中一端必須定義為owner,另一端必須定義為inverse(在對關聯表進行更性操作時這一端將被忽略)。被關聯端不必也不能描述物理映射,只需要一個簡單的mappedBy參數,該參數包含了主體端的屬性名,這樣就綁定了雙方的關系。

如何制作PO

1)找到CUBE--需要引入哪些類:

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

2)找到汽車人--主體端:

/** *//**
* Theater
* @author allen
*/
@SuppressWarnings("serial")
@Entity
@Table(name = "THEATER")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Theater implements Serializable {
   @ManyToMany(
       targetEntity=net.allen.domain.Audience.class,
       cascade ={CascadeType.PERSIST,CascadeType.MERGE},
       fetch=FetchType.LAZY
   )
   @JoinTable(
       name="THEATER_AUDIENCE",
       joinColumns={@JoinColumn(name="THEATER_ID")},
       inverseJoinColumns={@JoinColumn(name="AUDIENCE_ID")}
   )
   @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
   private List<Audience> audiences = new ArrayList<Audience>();
   /** *//**
   * @return Returns the audiences.
   */
   public List<Audience> getAudiences() {
     return audiences;
   }
   /** *//**
   * @param audiences The audiences to set.
   */
   public void setAudiences(List<Audience> audiences) {
     this.audiences = audiences;
   }
}

功能說明:

@ManyToMany注解

targetEntity屬性:指向被關聯端的實體對象

cascade屬性:與Hibernate xml配置文件中的意思一樣,這裡選用兩種方式

CascadeType.PERSIST:若實體是處於被管理狀態,或當persist()方法被調用時,觸發級聯創建(create)操作。

CascadeType.MERGE:若實體是處於被管理狀態,或當merge)方法被調用時,觸發級聯合並(merge)操作。

其它屬性如CascadeType.REMOVE、CascadeType.REFRESH、CascadeType.ALL等屬性可參考Hibernate Annotations Reference。

fetch屬性:關聯關系獲取方式

LAZY(默認值)在第一次訪問關聯對象時才觸發相應的查詢操作。

另一個值EAGER是通過out join select直接獲取關聯對象

@JoinTable注解

name屬性:指定關聯表名 若不指定Hibernate可以根據既定的規則自動生成(具體規則見reference)

joinColumns屬性:指定主體端的外鍵

inverseJoinColumns屬性:指定被關聯端的外鍵

@Cache注解

usage屬性:給定了緩存的並發策略

3)找到霸天虎--被關聯端:

/** *//**
* Audience
* @author allen
*/
@SuppressWarnings("serial")
@Entity
@Table(name = "AUDIENCE")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Audience implements Serializable {
   @ManyToMany(
      cascade={CascadeType.PERSIST,CascadeType.MERGE},
      mappedBy="audiences"
   )
   /** *//** 所在的劇院 */
   private List<Theater> theaters = new ArrayList<Theater>();
   /** *//**
   * @return Returns the theaters.
   */
   public List<Theater> getTheaters() {
     return theaters;
   }
   /** *//**
   * @param theaters The theaters to set.
   */
   public void setTheaters(List<Theater> theaters) {
     this.theaters = theaters;
   }
}

功能說明:

@ManyToMany注解

mappedBy屬性:指定了主體端的屬性名,用以綁定雙方的關系  

汽車人,變形!--如何操作

/** *//**
   * select transformers wathers from ShowMax Theater
   */
   protected void selectWathers() {
     //1) get current theater
     Theater theater = findTheaterById("showMax");
     //2) clear theater's audiences
     theater.getAudiences().clear();
     //3) get audiences who want to watch transformers
     List<Audience> audiences = findAudiencesByMovie("transformers");
     for (Audience a: audiences) {
       //4) mountain relations
       a.getTheaters().add(theater);
       theater.getAudiences().add(a);
     }
     //5) do save main entity
     doSaveEntity(theater);
   }

tips:注意第二步的操作。

好了,大功告成!說回電影,紅蜘蛛這小子跑得還挺快,期待續集!

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved