使用SpringDataJpa創(chuàng)建中間表
SpringDataJpa創(chuàng)建中間表
//fetch=FetchType.EAGER 關(guān)閉懶加載 相當(dāng)于hibernate中的lazy=false //joinColumns 配置中間表的主列 //inverseJoinColumns=@JoinColumn(name="t_roleId") 創(chuàng)建中間表的副列 @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="t1_user_permission",joinColumns=@JoinColumn(name="t_userId"), inverseJoinColumns=@JoinColumn(name="t_perId")) private List<Permission> perList; //mappedBy="roleList" 變成雙向 //mappedBy="roleList" 把主權(quán)交給user 然后 role里面就不創(chuàng)建中間表了 //表示聲明自己不是多對多的關(guān)系維護端,由對方來維護 @ManyToMany(mappedBy="perList",fetch=FetchType.EAGER) private List<User> userList;
JPA中間表(關(guān)系表)聯(lián)合主鍵配置說明
問題場景
平時在開發(fā)中經(jīng)常會出現(xiàn)多對多的關(guān)系,這個時候會創(chuàng)建一個關(guān)系表。但該關(guān)系表中并沒有設(shè)置唯一主鍵字段而是聯(lián)合主鍵,那么JPA下創(chuàng)建該關(guān)系表實體后運行項目會提示No identifier specified或does not define an IdClass的錯誤。
下面以用戶部門關(guān)系進行舉例說明,用戶和部門是多對多的關(guān)系。
數(shù)據(jù)表結(jié)構(gòu)
CREATE TABLE `mb_member_dept` ( ?? ?`member_id` ?bigint(20) NOT NULL , ?? ?`dept_id` ?bigint(20) NOT NULL , ?? ?PRIMARY KEY (`member_id`, `dept_id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
實體代碼
/** * 用戶部門實體 * @author lizebin * @version 1.0 * @date 2021/2/18 12:48 上午 * **/ @Getter @Setter @Entity @Table(name = "mb_member_dept") public class MemberDeptPO implements Serializable{ private static final long serialVersionUID = 1271571231859316736L; /** * 聯(lián)合主鍵用戶ID */ @Column(name = "member_id", length = 20) private long memberId; /** * 聯(lián)合主鍵部門ID */ @Column(name = "dept_id", length = 20) private long deptId; }
觀察以上代碼似乎并沒有什么問題,但在啟動項目時會提示以下錯誤:
Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.test.po.MemberDeptPO
此時需要在聯(lián)合主鍵字段memberId和deptId上增加@Id注解即可解決以上錯誤。這里需要注意的是,一般出現(xiàn)以上錯誤提示時只要在主鍵字段上增加@Id注解即可解決問題。
但再次啟動項目時還是會提示一個does not define an IdClass的錯誤:
Caused by: java.lang.IllegalArgumentException: This class [class com.test.po.MemberDeptPO] does not define an IdClass
這是因為聯(lián)合主鍵時需要額外定義一個idClass類作為實體的ID,idClass類代碼如下:
idClass類代碼
/** * 用戶部門關(guān)系聯(lián)合主鍵定義 * @author lizebin * @version 1.0 * @date 2021/2/18 10:36 上午 * **/ @Getter @Setter public class MemberDeptKey implements Serializable { private static final long serialVersionUID = -5482200454871393530L; /**聯(lián)合主鍵,字段名稱與MemberDeptPO 類中一致*/ private long memberId; /**聯(lián)合主鍵,字段名稱與MemberDeptPO 類中一致*/ private long deptId; public MemberDeptKey() { } public MemberDeptKey(long memberId, long deptId) { this.memberId = memberId; this.deptId = deptId; } }
說明:MemberDeptKey類中的字段必須為MemberDeptPO類中的聯(lián)合主鍵且字段名稱需保持一致。
實體類最終正確代碼
增加@IdClass(value = MemberDeptKey.class)和@Id注解
/** * 用戶部門實體 * @author lizebin * @version 1.0 * @date 2021/2/18 12:48 上午 * **/ @Getter @Setter @Entity @Table(name = "mb_member_dept") @IdClass(value = MemberDeptKey.class) // 定義聯(lián)合主鍵類 public class MemberDeptPO implements Serializable{ private static final long serialVersionUID = 1271571231859316736L; /** * 聯(lián)合主鍵用戶ID */ @Id // 定義該字段為主鍵 @Column(name = "member_id", length = 20) private long memberId; /** * 聯(lián)合主鍵部門ID */ @Id // 定義該字段為主鍵 @Column(name = "dept_id", length = 20) private long deptId; }
持久層配置
@Repository public interface IMemberDeptRepository extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> { }
由于這里使用類聯(lián)合主鍵,上面代碼中的ID不能在使用Long而是需要使用MemberDeptKey進行定義,最終代碼如下:
@Repository public interface IMemberDeptRepository extends JpaRepository<MemberDeptPO, MemberDeptKey>, JpaSpecificationExecutor<MemberDeptPO> { ?? ?/**通過ID獲取數(shù)據(jù)信息*/ ? ? MemberDeptPO findById(MemberDeptKey id); }
當(dāng)需要通過ID獲取數(shù)據(jù)時則如下調(diào)用即可:
@Autowired private IMemberDeptRepository memberDeptRepository; MemberDeptPO memberDeptPO = memberDeptRepository.findById(new MemberDeptKey(1l, 0l));
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring @Transaction 注解執(zhí)行事務(wù)的流程
這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開啟事務(wù)的?又是如何進行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細介紹,需要的朋友可以參考下2021-06-06mybatis根據(jù)表逆向自動化生成代碼的實現(xiàn)
若采用mybatis框架,數(shù)據(jù)庫新建表,手動編寫的話,需要編寫大量的實體類、mapper文件、mapper.xml文件,都是一些重復(fù)且有規(guī)律的工作。我們可以引用插件,然后做配置,自動生成這些文件,本文就來詳細的介紹一下2021-08-08Java開發(fā)常見錯誤之?dāng)?shù)值計算精度和舍入問題詳析
除了使用Double保存浮點數(shù)可能帶來精度問題外,更匪夷所思的是這種精度問題,下面這篇文章主要給大家介紹了關(guān)于Java開發(fā)常見錯誤之?dāng)?shù)值計算精度和舍入問題的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11Mybatis-Spring連接mysql 8.0配置步驟出錯的解決方法
這篇文章主要為大家詳細介紹了Mybatis-Spring連接mysql 8.0配置步驟出錯的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06