JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空
文章目錄
- 1.前言
- 2.錯誤示例:
- 3.正確示例
- 4.講解
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: 華南理工大學
(其他數據項省略)
總結
以上是生活随笔為你收集整理的JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库创建表的时候长度的介绍
- 下一篇: Android --- 怎么设置 Edi