`
mzhj
  • 浏览: 227528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

在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:注意第二步的操作。

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


PS:找到一份中文的hiberante annotations reference,与大家共享。点击下载

分享到:
评论

相关推荐

    hibernate-annotations-3.4.0.GA

    6. @ManyToOne、@OneToOne、@OneToMany、@ManyToMany:定义不同类型的关联关系,如一对一、一对多、多对多。 7. @JoinColumn:用于关联关系中指定外键字段的属性。 8. @Temporal:用于日期时间类型的字段,支持...

    hibernate annotations 中文参考手册

    Hibernate 提供了多种不同的映射策略来处理一对多和多对多关系: - **表关联**:通过额外的关联表来维护关系。 - **外键关联**:在子表中添加一个外键来指向父表的主键。 - **联合映射**:适用于具有多个表继承层次...

    Hibernate Annotations 中文文档

    多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射...

    hibernate annotations3.4.0 GA.rar

    现在已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*....

    hibernate annotations

    4. **关系映射(Relationship Mapping)**:Hibernate支持多种数据库关系,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过注解,我们可以轻松地定义这些关系,...

    hibernate 和hibernate_annotations(中文API).pdf帮助文档

    在这个“hibernate 和hibernate_annotations(中文API)帮助文档”中,我们将深入探讨Hibernate的核心概念、特性以及如何使用Hibernate Annotations进行对象的持久化。 一、Hibernate核心概念 1. 实体(Entity):在...

    HibernateAnnotations 中文版

    1. **注解驱动**: Hibernate Annotations 允许开发者使用 Java 注解来定义实体类、属性、关联关系等,这些注解替代了传统的 XML 映射文件,使得代码更加简洁,更易于维护。 2. **实体注解**: `@Entity` 注解标记一...

    hibernate annotations 3.4.0.GA API

    - **多对多(ManyToMany)**: 多对多关系使用@ManyToMany注解,可以通过@JoinTable定义中间表的映射。 5. **继承映射(Inheritance Mapping)** Hibernate支持单表继承(@Inheritance(strategy=InheritanceType....

    hibernate-annotations.jar

    6. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于描述对象间的关联关系,如一对一、一对多、多对多等。 7. `@Temporal`: 用于处理日期和时间类型的字段,可以设置时间类型(DATE, TIME, ...

    webwork hibernate annotations 三合一中文开发文档

    webwork2.1.7 中文开发文档 Hibernate Annotations参考文档-3.20中文开发文档 Hibernate_3.2.0_Reference_zh_CN中文开发文档

    hibernate-annotations

    Hibernate Annotations是Hibernate 3.x引入的一个模块,它允许开发者使用Java 5及以上版本的注解来定义对象关系映射,替代传统的XML配置文件。3.4.0.GA版本是该组件的一个稳定版本,修复了大量已知问题,提高了性能...

    hibernate-annotations-3.4.0(参考文档,doc/../index.html)

    6. `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`:这些注解用于处理各种类型的关联关系,如一对一、一对多、多对多。 三、实体生命周期管理 1. `@Transient`:标记不需持久化的属性,避免被Hibernate...

    hibernate-annotations 相关jar包

    6. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 这些注解用于定义实体类之间的关联关系,如一对一、一对多、多对一、多对多。 **三、使用步骤** 1. 引入Hibernate和Hibernate Annotations相关jar包:...

    hibernate annotations 中文文档

    - `@OneToMany`, `@ManyToMany`: 一对多和多对多的关系映射,通常需要使用`@JoinTable`来定义联接表。 - `@JoinColumn`: 定义外键列的属性,如名称、约束等。 - `@OrderColumn`: 用于有序集合,定义排序依据的列...

    hibernate_annotations.rar

    - **@ManyToMany**:多对多关系,通常使用@JoinTable来定义中间表。 6. **级联操作 (@Cascade)**:定义在关系注解中,用于控制关联对象的持久化行为,如保存、更新、删除等。 7. **懒加载 (@LazyCollection)**:...

    Hibernate-annotations-3.4最新版本

    比如,@OneToOne、@OneToMany、@ManyToOne和@ManyToMany分别用于表示一对一、一对多、多对一和多对多的关系。这些注解允许我们轻松地定义实体之间的关联,进一步简化了数据模型的设计。 在实际应用中,Hibernate-...

    Hibernate Annotations Reference 中文参考手册HTML版

    4. **关系映射**:Hibernate 支持多种关系映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。例如,用户与角色的关系: ```java @ManyToOne @JoinColumn(name...

    hibernate-annotations jar包

    使用注解Annotation时用的jar包。 包括: hibernate-commons-annotations-3.3.0.ga.jar hibernate-entitymanager.jar ejb3-persistence.jar hibernate-annotations.jar

Global site tag (gtag.js) - Google Analytics