Hibernate之表間關系
阿新 • • 發佈:2018-10-28
關系數據庫 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 @GeneratedValueprivate 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 ( idBIGINT 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之表間關系