Hibernate中的Entity类之间的OneToOne关联

来源:互联网 发布:淘宝女装店招图片 编辑:程序博客网 时间:2024/06/03 17:48

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;    }}

1 0
原创粉丝点击