亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用SpringDataJpa創(chuàng)建中間表

 更新時(shí)間:2022年06月13日 09:50:17   作者:夜游神..  
這篇文章主要介紹了使用SpringDataJpa創(chuàng)建中間表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)建中間表了
	//表示聲明自己不是多對(duì)多的關(guān)系維護(hù)端,由對(duì)方來(lái)維護(hù)
	@ManyToMany(mappedBy="perList",fetch=FetchType.EAGER)
	private List<User> userList;

JPA中間表(關(guān)系表)聯(lián)合主鍵配置說(shuō)明

問(wèn)題場(chǎng)景

平時(shí)在開(kāi)發(fā)中經(jīng)常會(huì)出現(xiàn)多對(duì)多的關(guān)系,這個(gè)時(shí)候會(huì)創(chuàng)建一個(gè)關(guān)系表。但該關(guān)系表中并沒(méi)有設(shè)置唯一主鍵字段而是聯(lián)合主鍵,那么JPA下創(chuàng)建該關(guān)系表實(shí)體后運(yùn)行項(xiàng)目會(huì)提示No identifier specified或does not define an IdClass的錯(cuò)誤。

下面以用戶(hù)部門(mén)關(guān)系進(jìn)行舉例說(shuō)明,用戶(hù)和部門(mén)是多對(duì)多的關(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;

實(shí)體代碼

/**
* 用戶(hù)部門(mén)實(shí)體
* @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)合主鍵用戶(hù)ID
  */
  @Column(name = "member_id", length = 20)
  private long memberId;
  /**
  * 聯(lián)合主鍵部門(mén)ID
  */
  @Column(name = "dept_id", length = 20)
  private long deptId;
}

觀察以上代碼似乎并沒(méi)有什么問(wèn)題,但在啟動(dòng)項(xiàng)目時(shí)會(huì)提示以下錯(cuò)誤:

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.test.po.MemberDeptPO

此時(shí)需要在聯(lián)合主鍵字段memberId和deptId上增加@Id注解即可解決以上錯(cuò)誤。這里需要注意的是,一般出現(xiàn)以上錯(cuò)誤提示時(shí)只要在主鍵字段上增加@Id注解即可解決問(wèn)題。

但再次啟動(dòng)項(xiàng)目時(shí)還是會(huì)提示一個(gè)does not define an IdClass的錯(cuò)誤:

Caused by: java.lang.IllegalArgumentException: This class [class com.test.po.MemberDeptPO] does not define an IdClass

這是因?yàn)槁?lián)合主鍵時(shí)需要額外定義一個(gè)idClass類(lèi)作為實(shí)體的ID,idClass類(lèi)代碼如下:

idClass類(lèi)代碼

/**
* 用戶(hù)部門(mén)關(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)合主鍵,字段名稱(chēng)與MemberDeptPO 類(lèi)中一致*/
    private long memberId;
	/**聯(lián)合主鍵,字段名稱(chēng)與MemberDeptPO 類(lèi)中一致*/
    private long deptId;
    public MemberDeptKey() { }
    public MemberDeptKey(long memberId, long deptId) {
        this.memberId = memberId;
        this.deptId = deptId;
    }
}

說(shuō)明:MemberDeptKey類(lèi)中的字段必須為MemberDeptPO類(lèi)中的聯(lián)合主鍵且字段名稱(chēng)需保持一致。

實(shí)體類(lèi)最終正確代碼

增加@IdClass(value = MemberDeptKey.class)和@Id注解

/**
* 用戶(hù)部門(mén)實(shí)體
* @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)合主鍵類(lèi)
public class MemberDeptPO implements Serializable{
  private static final long serialVersionUID = 1271571231859316736L;
  /**
  * 聯(lián)合主鍵用戶(hù)ID
  */
  @Id // 定義該字段為主鍵
  @Column(name = "member_id", length = 20)
  private long memberId;
  /**
  * 聯(lián)合主鍵部門(mén)ID
  */
  @Id // 定義該字段為主鍵
  @Column(name = "dept_id", length = 20)
  private long deptId;
}

持久層配置

@Repository
public interface IMemberDeptRepository extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
}

由于這里使用類(lèi)聯(lián)合主鍵,上面代碼中的ID不能在使用Long而是需要使用MemberDeptKey進(jìn)行定義,最終代碼如下:

@Repository
public interface IMemberDeptRepository extends JpaRepository<MemberDeptPO, MemberDeptKey>, JpaSpecificationExecutor<MemberDeptPO> {
?? ?/**通過(guò)ID獲取數(shù)據(jù)信息*/
? ? MemberDeptPO findById(MemberDeptKey id);
}

當(dāng)需要通過(guò)ID獲取數(shù)據(jù)時(shí)則如下調(diào)用即可:

@Autowired
private IMemberDeptRepository memberDeptRepository;
MemberDeptPO memberDeptPO = memberDeptRepository.findById(new MemberDeptKey(1l, 0l));

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring?boot集成loback日志配置的示例代碼

    spring?boot集成loback日志配置的示例代碼

    這篇文章主要介紹了spring?boot集成loback日志配置的示例代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java中的HashMap集合源碼詳細(xì)解讀

    Java中的HashMap集合源碼詳細(xì)解讀

    這篇文章主要介紹了Java中的HashMap集合源碼詳細(xì)解讀,hash表是一種數(shù)據(jù)結(jié)構(gòu),它擁有驚人的效率,它的時(shí)間復(fù)雜度低到接近O(1)這樣的常數(shù)級(jí),需要的朋友可以參考下
    2023-11-11
  • 聊聊SpringBoot整合Nacos自動(dòng)刷新配置的問(wèn)題

    聊聊SpringBoot整合Nacos自動(dòng)刷新配置的問(wèn)題

    Nacos作為SpringBoot服務(wù)的注冊(cè)中心和配置中心,本例將在配置文件中配置一個(gè)?cml.age=100?的配置項(xiàng),程序中編寫(xiě)一個(gè)方法讀取配置文件,并通過(guò)?Get--->/test/age?接口提供給瀏覽器訪問(wèn),感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Spring @Transaction 注解執(zhí)行事務(wù)的流程

    Spring @Transaction 注解執(zhí)行事務(wù)的流程

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開(kāi)啟事務(wù)的?又是如何進(jìn)行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-06-06
  • mybatis根據(jù)表逆向自動(dòng)化生成代碼的實(shí)現(xiàn)

    mybatis根據(jù)表逆向自動(dòng)化生成代碼的實(shí)現(xiàn)

    若采用mybatis框架,數(shù)據(jù)庫(kù)新建表,手動(dòng)編寫(xiě)的話,需要編寫(xiě)大量的實(shí)體類(lèi)、mapper文件、mapper.xml文件,都是一些重復(fù)且有規(guī)律的工作。我們可以引用插件,然后做配置,自動(dòng)生成這些文件,本文就來(lái)詳細(xì)的介紹一下
    2021-08-08
  • Java與kotlin詳細(xì)對(duì)比

    Java與kotlin詳細(xì)對(duì)比

    這篇文章主要介紹了Java與kotlin詳細(xì)對(duì)比,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java開(kāi)發(fā)常見(jiàn)錯(cuò)誤之?dāng)?shù)值計(jì)算精度和舍入問(wèn)題詳析

    Java開(kāi)發(fā)常見(jiàn)錯(cuò)誤之?dāng)?shù)值計(jì)算精度和舍入問(wèn)題詳析

    除了使用Double保存浮點(diǎn)數(shù)可能帶來(lái)精度問(wèn)題外,更匪夷所思的是這種精度問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java開(kāi)發(fā)常見(jiàn)錯(cuò)誤之?dāng)?shù)值計(jì)算精度和舍入問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • MyBatis一對(duì)多嵌套查詢(xún)的完整實(shí)例

    MyBatis一對(duì)多嵌套查詢(xún)的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于MyBatis一對(duì)多嵌套查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Mybatis-Spring連接mysql 8.0配置步驟出錯(cuò)的解決方法

    Mybatis-Spring連接mysql 8.0配置步驟出錯(cuò)的解決方法

    這篇文章主要為大家詳細(xì)介紹了Mybatis-Spring連接mysql 8.0配置步驟出錯(cuò)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Java十分鐘精通類(lèi)?封裝?繼承

    Java十分鐘精通類(lèi)?封裝?繼承

    基礎(chǔ)不牢地動(dòng)山搖,類(lèi)、封裝、繼承是我們?cè)趯W(xué)習(xí)基礎(chǔ)時(shí)必然要碰到的知識(shí)點(diǎn),讓我們一起來(lái)學(xué)習(xí)或回顧一下,感興趣的伙伴來(lái)看看吧
    2022-03-03

最新評(píng)論