使用Hibernate Annotations 维护多对多关系的心得

说明

  在HibernateAnnotations中通过@ManyToMany注解可定义多对多关联。同时,也需要通过注解@JoinTable描述关联表和关联条件。对于双向关联,其中一端必须定义为owner,另一端必须定义为inverse(在对关联表进行更性操作时这一端将被忽略)。被关联端不必也不能描述物理映射,只需要一个简单的mappedBy参数,该参数包含了主体端的属性名,这样就绑定了双方的关系。

  如何制作PO

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

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
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)找到汽车人--主体端:

双击代码全选
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
/** */ /**
* 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)找到霸天虎--被关联端:

双击代码全选
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
/** */ /**
* 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属性:指定了主体端的属性名,用以绑定双方的关系  

  汽车人,变形!--如何操作

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** */ /**
   * 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:注意第二步的操作。

  好了,大功告成!说回电影,红蜘蛛这小子跑得还挺快,期待续集!

本文示例代码或素材下载

原文地址:http://tech.ddvip.com/2008-12/122890056998951.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值