`

hibernate注解 关系映射 -多对多

 
阅读更多

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

分享到:
评论

相关推荐

    Hibernate 注解映射

    Hibernate 注解映射支持多种关联关系的映射,包括多对一、一对多、双向一对多和双向一对一。 * 多对一映射:使用 @ManyToOne 和 @JoinColumn 注解,指定关联列。 * 一对多映射:使用 @OneToMany 注解,默认会使用...

    Hibernate one-to-many / many-to-one关系映射

    在开发过程中,IDE如Eclipse或IntelliJ IDEA提供了对Hibernate的集成支持,包括代码生成、对象关系图显示以及自动配置检查,这使得关系映射的设置更加直观和便捷。 六、最佳实践 1. 选择合适的集合类型:根据业务...

    Hibernate注解 关联关系映射注解.docx

    多对多的关联关系可以使用`@ManyToMany`注解,Hibernate会自动创建一个中间表来存储两个实体类之间的关联。如果需要自定义中间表的名称或字段,可以使用`@JoinTable`注解。在双向多对多关联中,依然需要`mappedBy`来...

    hibernate注解处理映射关系共14页.pdf.zip

    本资料“hibernate注解处理映射关系共14页.pdf.zip”显然是一个关于Hibernate注解使用的详细教程,涵盖了14页的内容。以下是基于该主题的详尽知识点解析: 1. **Hibernate概述**:Hibernate是Java平台上的一个开源...

    Hibernate4(关系映射-事务-原理-性能和二级缓存-最佳实践)

    关系的数据库表示可以分为一对一、一对多和多对多三种类型。例如,一个部门表和一个部门主管表之间是一对一关系,而一个部门表和下属人员表之间则是一对多关系。对象表示方面,对象关系分为单向和双向。双向关系意味...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    HIBERNATE:Hibernate 学习一--注解方式自动建表

    - `@OneToMany`、`@ManyToOne`、`@OneToOne`、`@ManyToMany`:表示不同类型的关联关系,例如一对多、多对一、一对一和多对多。 3. **配置自动建表**: - 在Hibernate的配置文件(hibernate.cfg.xml)中,可以通过...

    hibernate-commons-annotations-5.0.1.Final.jar

    3. `org.hibernate.cfg`:这里的类主要用于配置和初始化Hibernate环境,如`AnnotationConfiguration`类就是配置Hibernate的入口,它会读取注解并生成相应的映射信息。 4. `org.hibernate.boot.model`和`org....

    hibernate 映射-一对多双向

    标题中的“hibernate 映射-一对多双向”指的是在Java Hibernate框架中处理数据库关系映射中的一对多关联关系,并且这种关联是双向的。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用Java对象来表示数据库...

    Hibernate 注解一对多,多对一

    "Hibernate注解一对多,多对一"是两个常见的关系映射类型,适用于处理实体类之间的复杂关联。 一、一对多关系 在现实世界中,例如一个部门有多个员工,这就是一对多的关系。在Hibernate中,我们可以使用`@...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate双向多对多关联映射(注解版)

    在这个“hibernate双向多对多关联映射(注解版)”的主题中,我们将深入探讨如何使用Hibernate的注解配置来处理数据库中的双向多对多关联关系。 首先,多对多关联在数据库设计中是指两个实体之间存在多个对应关系,...

    Hibernate关于注解的一对多,多对多,一对一

    本篇文章将深入探讨Hibernate中注解的一对多、多对多和一对一关系映射。 ### 一对多关系 在现实生活中,例如一个班级有一个班主任,而班主任可以管理多个学生,这就是典型的“一对多”关系。在Hibernate中,我们...

    hibernate单向多对多映射(注解版)

    在Java的持久化框架Hibernate中,单向多对多映射是一种常见的关系映射方式,尤其在处理数据库中两个实体间复杂关联时显得尤为重要。在注解版的Hibernate中,我们不再需要传统的XML配置文件,而是直接在实体类上使用...

    hibernate的关系映射

    2. **注解映射**: 随着Java 5的发布,Hibernate引入了注解支持,可以直接在类和属性上使用注解进行映射,简化了配置,提高了代码的可读性。 **四、懒加载和急加载** - **懒加载(Lazy Loading)**: 默认情况下,...

    hibernate关联关系映射

    三、多对一关系映射(Many-to-One) 与一对一相反,多对一表示多个实体实例对应一个实体实例。使用`@ManyToOne`注解来实现。在上述部门和员工的例子中,Employee类中也需要用到`@ManyToOne`来指明所属的Department...

    hibernate的多种映射关系

    Hibernate 支持多种集合类型,如 List、Set、Map 等,它们可以作为一对多或多对多关系的容器。`@ElementCollection` 用于映射非实体类属性的集合,而 `@OrderColumn` 可以指定集合元素的排序方式。 6. **级联操作 ...

    hibernate 关系注解

    在Hibernate中,关系注解用于在实体类中定义不同类型的数据库关系,如一对一、一对多、多对多等。以下是关于Hibernate关系注解的详细说明: 1. **一对一外键关联映射(单向)** 使用`@OneToOne`注解实现一对一关系...

Global site tag (gtag.js) - Google Analytics