日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 一对一设置无效,连表查询的时候另外一个实体类的对象值为空的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。