jpa实体关系-一对一
jpa实体关系中一对一分成两种:单向一对一和双向的一对一
单向的一对一映射
Employee
和ParkingSpace
是一对一的关系
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToOne
@JoinColumn(name = "space_id")
private ParkingSpace parkingSpace;
//getter & setter omit...
}
@Entity
public class ParkingSpace {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String spaceName;
//getter & setter omit...
}
通过@JoinColumn
注解来重写默认的联接名parkingSpace_id
为space_id
由hibernate创建的表如下:
mysql> desc parking_space;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| space_name | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
2 rows in set
mysql> desc employee;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(255) | YES | | NULL | |
| space_id | bigint(20) | YES | MUL | NULL | |
+----------+--------------+------+-----+---------+-------+
3 rows in set
几乎在每个关系中,与源方和目标方无关,双方中只要拥有联接列(JoinColumn)的一方称为所有方(owning side)或者关系所有者(owner),不具有联接列的一方称为非所有方(non-owning)或反方
在这里Employee
是所有方
双向一对一映射
一对一的目标实体经常会指回源实体对象的关系,如在单向一对一关系中,ParkingSpace
有一个指向Employee
的引用,这种情况称为双向一对一的关系
现在在ParkingSpace
中添加一个Employee
的引用,可以通过对employee
字段添加@OneToOne
注解来实现,作为注解的一部分,必须添加一个mappedBy
元素以指示所有方是Employee
,而不是ParkingSpace
,因为ParkingSpace
是关系的反方,所以不必提供联接列的信息
mysql> desc employee;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(255) | YES | | NULL | |
| space_id | bigint(20) | YES | MUL | NULL | |
+----------+--------------+------+-----+---------+-------+
3 rows in set
mysql> desc parking_space;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| space_name | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
2 rows in set
双向一对一关联的两条规则:
@JoinColumn
注解放置在映射到包含联接列的表的实体(关系所有者)的映射之上mappedBy
元素应该是在没有定义联接列的实体的@OneToOne
注解指定,或者在关系的反方