Hibernate中的Entity类之间的OneToMany关联

原创 2016年05月30日 10:37:10

OneToMany关联将一个父Entity类与若干个子Entity类联系起来。

1. 双向关联

通常,OneToMany关联都有与之反向的ManyToOne关联对应,两者成组出现,这被称为双向关联。

双向关联中,可以从任何一个Entity类实例访问关联的另一个Entity类实例(通过get*()方法)。

在数据库模式中,也只需要常规地,在子Entity类(owning side)中设置外键关联父Entity类(mappedBy side)即可。

父Entity定义如下:

@Entity(name = "Person")
public static class Person {

    @Id
    @GeneratedValue
    private Long id;
    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Phone> phones = new ArrayList<>();

    public Person() {
    }

    public Person(Long id) {
        this.id = id;
    }

    public List<Phone> getPhones() {
        return phones;
    }

    public void addPhone(Phone phone) {
        phones.add( phone );
        phone.setPerson( this );
    }

    public void removePhone(Phone phone) {
        phones.remove( phone );
        phone.setPerson( null );
    }
}

子Entity定义如下:

@Entity(name = "Phone")
public static class Phone {

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    @Column(unique = true)
    private String number;

    @ManyToOne
    private Person person;

    public Phone() {
    }

    public Phone(String number) {
        this.number = number;
    }

    public Long getId() {
        return id;
    }

    public String getNumber() {
        return number;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public boolean equals(Object o) {
        if ( this == o ) {
            return true;
        }
        if ( o == null || getClass() != o.getClass() ) {
            return false;
        }
        Phone phone = (Phone) o;
        return Objects.equals( number, phone.number );
    }

    @Override
    public int hashCode() {
        return Objects.hash( number );
    }
}
子Entity类重写了equals()和hashCode()方法,是为了利用Phone类中的number的唯一性,通常不是必须的。


2. 单向关联

不过,双向关联并不是必须的,也可以只有其中一种关联,就是单向关联,这样只能从拥有(owning)关联的Entity类实例访问关联的另一个Entity类实例。

如果只有OneToMany关联,则在数据库模式中,首先在子Entity类对应的数据库表中无需外键,因为子Entity类实例根本不知道要关联谁。此外,还额外需要一个中间表,以表示两者的关联关系。因为,在OneToMany关联的父Entity类(owning side)对应的数据库表中,是无法表示这种关联关系的。

父Entity定义如下:

@Entity(name = "Person")
public static class Person {

    @Id
    @GeneratedValue
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Phone> phones = new ArrayList<>();

    public Person() {
    }

    public List<Phone> getPhones() {
        return phones;
    }
}

子Entity定义如下:

@Entity(name = "Phone")
public static class Phone {

    @Id
    @GeneratedValue
    private Long id;

    private String number;

    public Phone() {
    }

    public Phone(String number) {
        this.number = number;
    }

    public Long getId() {
        return id;
    }

    public String getNumber() {
        return number;
    }
}

数据库模式中的中间表如下:

CREATE TABLE Person_Phone (
    Person_id BIGINT NOT NULL ,
    phones_id BIGINT NOT NULL
)

单向关联在删除子Entity类实例的操作中,执行效率非常低下。因为,在持久化的操作过程中,首先要删除父Entity类实例关联的所有子Entity类实例,然后再重新插入尚未被删除的子Entity类实例。


版权声明:本文为博主原创文章,未经博主允许不得转载。

hibernate 注解方式配置OneToMany(一对多)连接查询(非外键)

场景描述: - 2张表,班级表class_a,对应实体ClassBean,字段:id, name, location . - 学生表student, 对应实体Student,字段:id, cl...
  • PKWind
  • PKWind
  • 2015年11月10日 11:32
  • 4711

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

最近我也是有点郁闷,到底是程序中处理关联关系,还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这种关联关系的话,自己去维护这种约束。这种很乐观的一种做法!或者是直接在数据库中处理这种直接的...

OneToMany 页面中查询关联表中的数值

@OneToMany(cascade={CascadeType.REMOVE},fetch=FetchType.LAZY) @JoinColumn(name="gzdm") @KeyProperty(...

hibernate中一对多关系hql条件查询

当hibernate中难免遇到一对多的情况,并且需要对多方添加条件,使用sql查询会简单很多,hql的语法如下 Teacher对应下有多个Student Teacher中Set students;...

为什么Hibernate的OneToMany用Set集合而不用list

将一个对象放在一个list中,在将这个对象的属性改变,再放入这个list中,这个list中的对象属性是不是一样的呢 user对象实体: public class User implements S...

Hibernate 使用 Annotation 之 OneToMany(单向关联关系)

Java代码如下: package com.lwp.hibernate.Model; import java.io.Serializable; import java.util.HashSet; ...

Hibernate关系映射(五)一对多、多对一双向关联@OneToMany @OneToMany Annotation方式

前两篇介绍了一对多和多对一的单向关联,而且前几篇发帖时间都比较紧凑,由于春节期间和收假这段时间都在帮公司的培训中心架构开发一个在线考试系统,所以就耽搁了,不好意思。那么言归正传,本篇介绍一对多,多对一...

Hibernate中ManyToOne,OneToMany,OneToOne的使用例

有3个表: News:新闻表 NewsResource:新闻附件表 Resource:资源表 表关系: 1个新闻(News)对应多条新闻附件(NewsResource) News:ID    New...

Hibernate4中的onetomany的理解

分析场景: departments对应多个员工employees: departments.hbm.xml: "-//Hibernate/Hibernate Mapping DTD 3.0//E...

Hibernate学习总结:OneToMany单向关联

说明: 一、例子是一个组有许多用户,但一个用户只能属于一个组 二、本次使用的Hibernate版本是hibernate-release-4.3.11.Final. 先写Annotation...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate中的Entity类之间的OneToMany关联
举报原因:
原因补充:

(最多只允许输入30个字)