Hibernate中的Entity类之间的OneToOne关联

原创 2016年05月30日 14:30:24

Hibernate中的Entity类之间的OneToOne关联也存在单向关联和双向关联两种形式。

OneToOne关联的两个Entity类是完全对等的,任何一方都可以是这种关联的子类(owning side),而另一方是父类(reverse side)。


1. 双向关联

在OneToOne关联的两个Entity类中,选择一个作为子实体类(owning side),其对应的表中设置外键;另一个作为父实体类(inverse side)并设置mappedBy="..."关联属性。

父Entity类定义如下:

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

    @Id
    @GeneratedValue
    private Long id;

    private String number;

    @OneToOne(mappedBy = "phone", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private PhoneDetails details;

    public Phone() {
    }

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

    public Long getId() {
        return id;
    }

    public String getNumber() {
        return number;
    }

    public PhoneDetails getDetails() {
        return details;
    }

    public void addDetails(PhoneDetails details) {
        details.setPhone( this );
        this.details = details;
    }

    public void removeDetails() {
        if ( details != null ) {
            details.setPhone( null );
            this.details = null;
        }
    }
}


子Entity类定义如下:

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

    @Id
    @GeneratedValue
    private Long id;

    private String provider;

    private String technology;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "phone_id")
    private Phone phone;

    public PhoneDetails() {
    }

    public PhoneDetails(String provider, String technology) {
        this.provider = provider;
        this.technology = technology;
    }

    public String getProvider() {
        return provider;
    }

    public String getTechnology() {
        return technology;
    }

    public void setTechnology(String technology) {
        this.technology = technology;
    }

    public Phone getPhone() {
        return phone;
    }

    public void setPhone(Phone phone) {
        this.phone = phone;
    }
}

在这种双向关联中,Hibernate自动为子实体类(owning side)中的外键属性设置UNIQUE约束。如果违反了该约束,则在访问父实体类时会抛出org.hibernate.HibernateException异常。


2. 单向关联

在OneToOne单向关联中,只需在子实体类(owning side)设置关联,只需在子实体类(owning side)对应的表中设置外键。

父Entity类定义如下:

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

    @Id
    @GeneratedValue
    private Long id;

    private String provider;

    private String technology;

    public PhoneDetails() {
    }

    public PhoneDetails(String provider, String technology) {
        this.provider = provider;
        this.technology = technology;
    }

    public String getProvider() {
        return provider;
    }

    public String getTechnology() {
        return technology;
    }

    public void setTechnology(String technology) {
        this.technology = technology;
    }
}

子Entity类定义如下:

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

    @Id
    @GeneratedValue
    private Long id;

    private String number;

    @OneToOne
    @JoinColumn(name = "details_id")
    private PhoneDetails details;

    public Phone() {
    }

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

    public Long getId() {
        return id;
    }

    public String getNumber() {
        return number;
    }

    public PhoneDetails getDetails() {
        return details;
    }

    public void setDetails(PhoneDetails details) {
        this.details = details;
    }
}

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

NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z解决

在用JUnit做测试是,报错java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z   解决方法: ...
  • u011721609
  • u011721609
  • 2013年11月06日 15:12
  • 949

Hibernate关系映射(二)一对一双向外键关联@OneToOne Annotation方式

在上一篇,也就是Hibernate关系映射(一)中已经介绍了一对一单向外键关联,本篇介绍一对一双向外键关联首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(bra...
  • MurcielagoAN
  • MurcielagoAN
  • 2015年02月27日 09:57
  • 3033

hibernate关系映射--双向一对一@OneToOne

1.基于外键的双向一对一 基于外键的双向一对一,外键可以存放在任意一端,只需在外键表的那端添加注解@OneToOne,@JoinColumn在主表中也应添加注解@OneToOne,同时设置m...
  • muyeju
  • muyeju
  • 2015年08月23日 14:35
  • 2516

hibernate的OneToOne映射等

hibernate的OneToOne探究
  • u011526599
  • u011526599
  • 2016年04月19日 23:54
  • 3643

Hibernate关系映射(二)一对一双向外键关联@OneToOne Annotation方式

在上一篇,也就是Hibernate关系映射(一)中已经介绍了一对一单向外键关联,本篇介绍一对一双向外键关联首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(bra...
  • MurcielagoAN
  • MurcielagoAN
  • 2015年02月27日 09:57
  • 3033

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

一对一(@OneToOne) · 单向关联 # 注释@OneToOne定义如下: @Target({METHOD, FIELD}) @Retention(RUNTIME) public @inter...
  • mimi5821741
  • mimi5821741
  • 2014年12月11日 13:47
  • 5318

Hibernate annotation@OneToOne共享主键关联

http://javne.iteye.com/blog/407123 文章表article表,文章内容表:article_data表 article_data表的主键同时也是外键对应的值是...
  • x6587305x
  • x6587305x
  • 2012年04月04日 21:44
  • 5156

JPA-@oneToOne

一对一(@OneToOne) · 单向关联 # 注释@OneToOne定义如下: @Target({METHOD, FIELD}) @Retention(RUNTIME) public @...
  • HYDchosen1
  • HYDchosen1
  • 2016年12月14日 16:30
  • 281

Hibernate学习总结:OneToOne单向主键关联

说明: 一、还是举那个一夫一妻的例子来讲述一对一单向主键关联。 二、本次使用的Hibernate版本是hibernate-release-4.3.11.Final. 先写Annotation版本:...
  • sinat_18882775
  • sinat_18882775
  • 2016年04月16日 23:21
  • 1775

hibernate JPA @OneToOne双向关联共享主键

之前做项目的时候,老大设计的很多表都是主键共享,所以今天
  • haidian_fengyu
  • haidian_fengyu
  • 2014年09月19日 11:28
  • 1614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate中的Entity类之间的OneToOne关联
举报原因:
原因补充:

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