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注解指定,或者在关系的反方
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值