Hibernate中实体之间的关联
关联描述了两个或多个实体如何基于数据库连接语义建立关系。
1、多对一关联:多对一是最常用的关联,在关系数据库中也有直接的等价关系(例如,外键)
.因此它建立了一个子实体和一个父实体之间的关系。
例119:多对一关联
设置一对多关联要用到注解“@ManyToOne”。
@Entity(name = "Person")
public static class Person {
@Id
@GeneratedValue
private Long id;
public Person() {
}
}
@Entity(name = "Phone")
public static class Phone {
@Id
@GeneratedValue
private Long id;
@Column(name = "`number`")
private String number;
//设置多对一用注解“@ManyToOne”。@JoinColumn用来设置“外键”,参数“name”设定数据库表“Phone”对应外键的列名。
@ManyToOne
@JoinColumn(name = "person_id",
foreignKey = @ForeignKey(name = "PERSON_ID_FK")
)
private Person person;
public Phone() {
}
public Phone(String number) {
this.number = number;
}
public Long getId() {
return id;
}
public String getNumber() {
return number;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
创建数据库中表的语句:
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
每一个实体都有他自己的生命周期。一旦设置了@ManyToOne关联,Hibernate会自动设置数据库中对应表的外键。
例120:多对一关联的生命周期
假设在自己的程序中有下列代码片段,并设置将执行时期的SQL语句打印出来。
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