【轉載】使用Hibernate Annotations 維護多對多關係的心得

 

說明
        在HibernateAnnotations中經過@ManyToMany註解可定義多對多關聯。同時,也須要經過註解@JoinTable描述關聯表和關聯條件。對於雙向關聯,其中一端必須定義爲owner,另外一端必須定義爲inverse(在對關聯表進行更性操做時這一端將被忽略)。被關聯端沒必要也不能描述物理映射,只須要一個簡單的mappedBy參數,該參數包含了主體端的屬性名,這樣就綁定了雙方的關係。
      上週六去電影院圓了兒時的夢想,看了變形金剛,超棒的一部片子 ^_^。那麼就以劇院和觀衆爲例講解吧。
如何製做PO
1)找到CUBE--須要引入哪些類:java

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;
    }
}app

功能說明:
@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屬性:指定被關聯端的外鍵dom

@Cache註解
     usage屬性:給定了緩存的併發策略
3)找到霸天虎--被關聯端:fetch

/**
* 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;
    }
}this

功能說明:
@ManyToMany註解
     mappedBy屬性:指定了主體端的屬性名,用以綁定雙方的關係   
汽車人,變形!--如何操做hibernate

/**
     * 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);
    }orm

tips:注意第二步的操做。xml

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

相關文章
相關標籤/搜索