天天看點

Hibernate中的Entity類之間的OneToOne關聯

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

繼續閱讀