最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年06月13日 09:50:17   作者:夜游神..  
這篇文章主要介紹了使用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)系維護(hù)端,由對方來維護(hù)
	@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)系表實(shí)體后運(yùn)行項(xiàng)目會提示No identifier specified或does not define an IdClass的錯誤。

下面以用戶部門關(guān)系進(jì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;

實(shí)體代碼

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

觀察以上代碼似乎并沒有什么問題,但在啟動項(xiàng)目時會提示以下錯誤:

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

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

但再次啟動項(xiàng)目時還是會提示一個does not define an IdClass的錯誤:

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

這是因?yàn)槁?lián)合主鍵時需要額外定義一個idClass類作為實(shí)體的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)合主鍵且字段名稱需保持一致。

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

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

/**
* 用戶部門實(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)合主鍵類
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進(jìn)行定義,最終代碼如下:

@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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

额敏县| 潞城市| 金湖县| 噶尔县| 榕江县| 宁南县| 乌鲁木齐市| 洪泽县| 鹰潭市| 芜湖县| 平罗县| 岳普湖县| 美姑县| 谢通门县| 海城市| 昔阳县| 桂东县| 监利县| 贞丰县| 东辽县| 宽城| 湟中县| 宽城| 通许县| 莆田市| 南投县| 冀州市| 湛江市| 辉南县| 晋江市| 宜君县| 山西省| 苍山县| 松阳县| 纳雍县| 叙永县| 辽宁省| 铅山县| 如皋市| 连江县| 昌图县|