JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空

1.前言

今天在使用 JPA 的时候发现了这样一个问题,User 表和 OrganInfo 表配置了一对一关系,连表查询的时候只能够查到表 User 对象实体的数据,而 OrganInfo 对象实体为空,原因请看下面讲解,我设置的是 User 到 OrganInfo 的单项关系,如果想要设置双向关系,在 OrganInfo 实体类中添加关系即可

2.错误示例:

在 User.java中设置对应 OrganInfo 的关系

 private static final long serialVersionUID = -1326615142912926353L;
    @Id
    @Column(name = "user_id")
    private String userId;
    @Column(name = "pwd")
    private String pwd;
    @Column(name = "fullname")
    private String fullName;
    @Column(name = "sex")
    private String sex;
    @Column(name = "age")
    private Integer age;
    @Column(name = "tel")
    private String tel;
    @Column(name = "status")
    private Integer status;
    @Column(name = "image_id")
    private String imageId;
    
	// User-OrganInfo
    @OneToOne(fetch = FetchType.EAGER) // EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中
    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
            insertable = false, updatable = false)
    private OrganInfo organInfo;
	// Get Set 省略

OrganInfo 实体类中字段如下(主要看主键是谁

public class OrganInfo implements Serializable {
    private static final long serialVersionUID = -1326615142912926353L;
  
    @Column(name = "user_id", nullable = false)
    private String userId;
    @Id
    @Column(name = "organ_id", nullable = false)
    private String organId;
    @Column(name = "organ_name")
    private String organName;
    @Column(name = "organ_introduce")
    private String organIntroduce;
    @Column(name = "licence_id")
    private String licenceId;
    @Column(name = "image_id")
    private String imageId;
}

连表查询时就会造成空值的现象,如下图:
在这里插入图片描述原因是什么呢?

3.正确示例

修改 OrganInfo 实体类中的主键为 userId , 对应数据库中的主键也要修改

public class OrganInfo implements Serializable {
    private static final long serialVersionUID = -1326615142912926353L;
    @Id
    @Column(name = "user_id", nullable = false)
    private String userId;
    @Column(name = "organ_id", nullable = false)
    private String organId;
    @Column(name = "organ_name")
    private String organName;
    @Column(name = "organ_introduce")
    private String organIntroduce;
    @Column(name = "licence_id")
    private String licenceId;
    @Column(name = "image_id")
    private String imageId;
}

数据显示正常
在这里插入图片描述

4.讲解

	// User-OrganInfo
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
            insertable = false, updatable = false)
    private OrganInfo organInfo;

name: 外键字段名称
referencedColumnName: 参照的主表的主键名称

因为主表要通过主键来控制数据的唯一性,而从表也要控制数据的唯一性,才能称得上为一对一
上面错误的例子中,主表通过 userId 来控制数据的唯一性,而从表的外键是 userId ,那么两个表关联起来的时候,从表的数据可以不唯一,比如:

主表:userId: 123
从表:organId: zhongShan userId: 123

主表:userId: 123
从表:organId: huanNan userId: 123

(其他数据项省略)
这种就属于一对多关系了,根本不是一对一

如果将从表的主键换为 userId ,也为外键,那么就可以保证从表数据的唯一性,即一对一,如:

主表:userId:123
从表:userId:123 organId: 中山大学

主表:userId:222
从表:userId:222 organId: 华南理工大学

(其他数据项省略)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值