在InheritanceType.TABLE_PER_CLASS
不可能實現Address
與Person
有多對一的關係。 Hibernate不創建關聯。
但是可以在Student
和Address
之間創建單向一對多。這裏是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
可以在Address
和Person
,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
可以在Address
和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.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
實體之間存在一對多關係。
在數據庫中,地址表有可能具有四個表的外鍵; –
@JaySmith它**是可能**或**不可能**? – Sandeep