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类实例。


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

@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)

例如我们用一个例子来开启JPA的一对多和多对一的学习。   比如你去当当网上买书籍,当当网就给你一个订单。   通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们...
  • gebitan505
  • gebitan505
  • 2014年03月30日 23:16
  • 57214

Hibernate @OneToMany等注解设置查询过滤条件等

1、如实体PdOrg对象中有users对象,数据库user表有字段DEL_FLAG(0:删除;1:未删除): private List users= new ArrayList(); 生成get、...
  • u010061060
  • u010061060
  • 2017年03月29日 11:05
  • 1336

Hibernate中onetomany实例二

1: Student类public class Student {  private int id; private String name; private Classes classes;  pu...
  • woshisap
  • woshisap
  • 2011年05月25日 23:59
  • 3257

Hibernate中onetomany实例一

1:第一个实例class类:public class Classes {  private int id; private String name;  private Set students; pu...
  • woshisap
  • woshisap
  • 2011年05月25日 23:40
  • 6770

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

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

Hibernate学习总结:OneToMany单向关联

说明: 一、例子是一个组有许多用户,但一个用户只能属于一个组 二、本次使用的Hibernate版本是hibernate-release-4.3.11.Final. 先写Annotation...
  • sinat_18882775
  • sinat_18882775
  • 2016年04月17日 01:34
  • 1788

Hibernate中使用左外连接

hibernate中的左外连接要怎么设置呢? 很简单:设置fetch属性为EAGER即可。加载策略中:LZAY使用的是inner join;EAGER使用的是left join。 @ManyToOn...
  • qq_33556185
  • qq_33556185
  • 2016年08月05日 11:31
  • 3806

Hibernate中的Entity类之间的ManyToMany关联

Hibernate中的Entity类之间的ManyToMany关联,必须在数据库模式中有一个中间连接表,其中的外键作为两个实体表之间的桥梁;而实体表中没有外键。 1. ManyToMany单向关联 ...
  • taiyangdao
  • taiyangdao
  • 2016年05月31日 15:46
  • 1140

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

Java代码如下: package com.lwp.hibernate.Model; import java.io.Serializable; import java.util.HashSet; ...
  • liangoo7
  • liangoo7
  • 2012年10月10日 21:53
  • 7969

JPA总结——实体关系映射(一对多@OneToMany)

注意:本文出自“阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多...
  • caiyanzhi123
  • caiyanzhi123
  • 2016年03月08日 16:23
  • 15268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate中的Entity类之间的OneToMany关联
举报原因:
原因补充:

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