jpa实体关系-一对一

jpa实体关系-一对一

jpa实体关系中一对一分成两种:单向一对一和双向的一对一

单向的一对一映射

EmployeeParkingSpace是一对一的关系

@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_idspace_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注解指定,或者在关系的反方

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/81009959
今日推荐