2017-04-26 176 views
1

本文來自於一本名爲的書,其中hibernate的持久性爲,作者描述了的每個具體類的表缺點在hibernate中的繼承策略。在給定的例子中,學生和老師是Person類的子類,Person與Address類相關聯。我無法理解這是下面給出這個特定的參數: - 對多態關聯有人可以幫助我理解與hibernate中的繼承策略相關的以下邏輯嗎?

不完美的支持:當 一個父類與另一個持久化類相關聯時出現問題。在我們的示例中, 假設Person與Address類關聯,因此Student和 Teacher也與Address關聯。要根據這種方法映射這個類層次結構 ,我們需要這四個表格在我們的數據庫 模式:PERSON,STUDENT,TEACHER和ADDRESS。 如果地址與Person具有 多對一關係(多個人可能有 相同的地址),則ADDRESS表應按順序提供對所有PERSON,STUDENT和TEACHER表的外鍵 引用建立數據庫級關係 ,但這是不可能的。

爲什麼不可能的地址表以人,學生和教師的表提供外鍵引用?

+0

在數據庫中,地址表有可能具有四個表的外鍵; –

+0

@JaySmith它**是可能**或**不可能**? – Sandeep

回答

0

假設您有三個不同的數據庫表PERSON,STUDENTTEACHER如何定義表ADDRESS上的外鍵約束?你可以看到,你將不得不指向三個數據庫表格。這是不可能的。

0

InheritanceType.TABLE_PER_CLASS不可能實現AddressPerson有多對一的關係。 Hibernate不創建關聯。

但是可以在StudentAddress之間創建單向一對多。這裏是Address實體:

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String address; 

    public Address() { 
    } 

Person實體是:

@Entity 
@Table(name = "persons") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

    public Person() { 
    } 

Student實體子類Person實體:

@Entity 
@Table(name = "students") 
public class Student extends Person { 
    @OneToMany() 
    @JoinColumn(name = "student_id", referencedColumnName = "id") 
    private List<Address> addresses; 

    public Student() { 
    } 

由於@JoinColumn的註釋休眠中address表中創建student_id列,並增加了國外關鍵約束。冬眠日誌:

Hibernate: 

    create table Address (
     id bigint not null, 
     address varchar(255), 
     student_id bigint, 
     primary key (id) 
    ) 

Hibernate: 

    create table persons (
     id bigint not null, 
     name varchar(255), 
     primary key (id) 
    ) 
Hibernate: 

    create table students (
     id bigint not null, 
     name varchar(255), 
     primary key (id) 
    ) 
Hibernate: 

    alter table Address 
     add constraint FKpe2jekm3pchvipc2cct5u5win 
     foreign key (student_id) 
     references students (id) 

雙向關聯和Address之間Student可以實現:

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String address; 

    @ManyToOne 
    private Student student; 

    public Address() { 
    } 

而且Student實體是:

@Entity 
@Table(name = "students") 
public class Student extends Person { 
    @OneToMany(mappedBy="student") 
    private List<Address> addresses; 

    public Student() { 
    } 

休眠創建相同分貝表作爲在單向單上述多對多。

但是與InheritanceType.JOINED可以在AddressPerson,Student之間創建多對一的雙向。這裏是Address實體:

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String address; 

    @ManyToOne 
    private Person person; 

    public Address() { 
    } 

Person實體:

@Entity 
@Table(name = "persons") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

    @OneToMany(mappedBy="person") 
    private List<Address> addresses; 

    public Person() { 
    } 

Student實體是:

@Entity 
@Table(name = "students") 
public class Student extends Person { 

    private String email; 

    public Student() { 
    } 

休眠創建表:

Hibernate: 

    create table Address (
     id bigint not null, 
     address varchar(255), 
     person_id bigint, 
     primary key (id) 
    ) 

Hibernate: 

    create table persons (
     id bigint not null, 
     name varchar(255), 
     primary key (id) 
    ) 
Hibernate: 

    create table students (
     email varchar(255), 
     id bigint not null, 
     primary key (id) 
    ) 

Hibernate: 

    alter table Address 
     add constraint FKtaq05im3hxcvufy75xk044251 
     foreign key (person_id) 
     references persons (id) 
Hibernate: 

    alter table students 
     add constraint FK9nqs0pkter5l6no6n9v93uyau 
     foreign key (id) 
     references persons (id) 

students表引用persons表通過FK9nqs0pkter5l6no6n9v93uyau約束。 address表引用persons表通過FKtaq05im3hxcvufy75xk044251。這意味着hibernate處理Student實體和Address實體之間的一對多實體addresses集合Person實體。任何子類爲Person的實體與Address實體具有一對多關係。

使用InheritanceType.SINGLE_TABLE可以在AddressStudent之間創建多對一的雙向。這裏是Address實體:

@Entity 
    public class Address { 
     @Id 
     @GeneratedValue 
     private Long id; 
     private String address; 

     @ManyToOne 
     private Person person; 

     public Address() { 
     } 

Person實體是:

@Entity 
@Table(name = "persons") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

    @OneToMany(mappedBy="person") 
    private List<Address> addresses; 

    public Person() { 
    } 

Student實體是:

012:

@Entity 
@Table(name = "students") 
public class Student extends Person { 

    private String studentEmail; 

    public Student() { 
    } 

休眠在Student領域和Person實體創建一個表

Student由於FKtaq05im3hxcvufy75xk044251約束,實體與Address實體之間存在一對多關係。

相關問題