1. 程式人生 > >Hibernate之表間關系

Hibernate之表間關系

關系數據庫 creat arc shc vat arr 單向 ring array

ManyToOne

多對一,是最常見的表間關系,對應關系數據庫中的外鍵關系。通常用於建立子實體和其父實體的關聯關系

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

    @Id
    @GeneratedValue
    private Long id;

    //Getters and setters are omitted for brevity

}

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

    @Id
    @GeneratedValue
    
private Long id; @Column(name = "`number`") private String number; @ManyToOne @JoinColumn(name = "person_id", foreignKey = @ForeignKey(name = "PERSON_ID_FK") ) private Person person; //Getters and setters are omitted for brevity }
CREATE TABLE Person (
    id 
BIGINT NOT NULL , PRIMARY KEY ( id ) ) CREATE TABLE Phone ( id BIGINT NOT NULL , number VARCHAR(255) , person_id BIGINT , PRIMARY KEY ( id ) ) ALTER TABLE Phone ADD CONSTRAINT PERSON_ID_FK FOREIGN KEY (person_id) REFERENCES Person
例子:

Person person = new Person(); entityManager.persist( person ); Phone phone
= new Phone( "123-456-7890" ); phone.setPerson( person ); entityManager.persist( phone ); entityManager.flush(); phone.setPerson( null ); INSERT INTO Person ( id ) VALUES ( 1 ) INSERT INTO Phone ( number, person_id, id ) VALUES ( ‘123-456-7890‘, 1, 2 ) UPDATE Phone SET number = ‘123-456-7890‘, person_id = NULL WHERE id = 2

OneToMany

一對多用於建立父實體和子實體之間的關系。如果子實體側沒有對應的ManyToOne配置,則這個OneToMany是單向的。如果子實體側有對應的ManyToOne配置,則這個OneToMany是雙向的。雙向的關系,可以讓開發者在兩側都能獲取關聯關系。

單向的一對多關系,實例:

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

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Phone> phones = new ArrayList<>();

    //Getters and setters are omitted for brevity

}

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

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "`number`")
    private String number;

    //Getters and setters are omitted for brevity

}
CREATE TABLE Person (
    id BIGINT NOT NULL ,
    PRIMARY KEY ( id )
)

CREATE TABLE Person_Phone (
    Person_id BIGINT NOT NULL ,
    phones_id BIGINT NOT NULL
)

CREATE TABLE Phone (
    id BIGINT NOT NULL ,
    number VARCHAR(255) ,
    PRIMARY KEY ( id )
)

ALTER TABLE Person_Phone
ADD CONSTRAINT UK_9uhc5itwc9h5gcng944pcaslf
UNIQUE (phones_id)

ALTER TABLE Person_Phone
ADD CONSTRAINT FKr38us2n8g5p9rj0b494sd3391
FOREIGN KEY (phones_id) REFERENCES Phone

ALTER TABLE Person_Phone
ADD CONSTRAINT FK2ex4e4p7w1cj310kg2woisjl2
FOREIGN KEY (Person_id) REFERENCES Person

Hibernate對單向的一對多關系,兩個實體對應兩個表,關聯關系使用一個中間表來表達。單向一對多在級聯操作上比較低效。

雙向一對多

Hibernate處理雙向一對多關系,按多對一的關系來處理,本質上還是主外鍵關系。雙向的一對多使父子雙方都能能力來獲取關聯關系。使操作更方便,效率等同多對一。

@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<>();

    //Getters and setters are omitted for brevity

    public void addPhone(Phone phone) {
        phones.add( phone );
        phone.setPerson( this );
    }

    public void removePhone(Phone phone) {
        phones.remove( phone );
        phone.setPerson( null );
    }
}

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

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    @Column(name = "`number`", unique = true)
    private String number;

    @ManyToOne
    private Person person;

    //Getters and setters are omitted for brevity

    @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 );
    }
}
CREATE TABLE Person (
    id BIGINT NOT NULL ,
    PRIMARY KEY ( id )
)

CREATE TABLE Phone (
    id BIGINT NOT NULL ,
    number VARCHAR(255) ,
    person_id BIGINT ,
    PRIMARY KEY ( id )
)

ALTER TABLE Phone
ADD CONSTRAINT UK_l329ab0g4c1t78onljnxmbnp6
UNIQUE (number)

ALTER TABLE Phone
ADD CONSTRAINT FKmw13yfsjypiiq0i1osdkaeqpg
FOREIGN KEY (person_id) REFERENCES Person

Hibernate之表間關系