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 Annotation方式

本篇介绍一对多单向关联,实例还是和Hibernate关系映射(三)多对一单向关联中的例子一样,一个车主(Owner)可以有多辆车,一辆车(Car)只能有一个车主,下面是表结构: 表结构和多对一的...

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

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

Hibernate 中annotations(注解开发)的@OneToMany 一对多双向关联映射后,出现的jar包冲突问题

Hibernate 注解开发时,一对多关系映射时发生了jar包冲突问题,java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanR...

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

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

Hibernate中的Entity类之间的ManyToMany关联

Hibernate中的Entity类之间的ManyToMany关联,必须在数据库模式中有一个中间连接表,其中的外键作为两个实体表之间的桥梁;而实体表中没有外键。 1. ManyToMany单向关联 ...

Hibernate学习总结:OneToMany单向关联

说明: 一、例子是一个组有许多用户,但一个用户只能属于一个组 二、本次使用的Hibernate版本是hibernate-release-4.3.11.Final. 先写Annotation...

Hibernate xml配置方法之OneToMany(双向关联关系)

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

Hibernate xml配置方法之OneToMany(单向关联关系)

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

hibernate3.3.2学习笔记---OneToMany双向关联

自己觉得官方文档写的比较清楚了,所以把官方文档粘下来,并附上自己的运行代码。 在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端的关联注解为@OneToMany( ...

【Hibernate】单向关联的oneTomany练习

<!-- set元素和类中的set集合对应 * 从外键的角度建立classes与student之间的关系 * 从类与类的角度建立classes与stu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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