<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
//fetch=FetchType.EAGER 關閉懶載入 相當於hibernate中的lazy=false //joinColumns 設定中間表的主列 //inverseJoinColumns=@JoinColumn(name="t_roleId") 建立中間表的副列 @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" 把主權交給user 然後 role裡面就不建立中間表了 //表示宣告自己不是多對多的關係維護端,由對方來維護 @ManyToMany(mappedBy="perList",fetch=FetchType.EAGER) private List<User> userList;
平時在開發中經常會出現多對多的關係,這個時候會建立一個關係表。但該關係表中並沒有設定唯一主鍵欄位而是聯合主鍵,那麼JPA下建立該關係表實體後執行專案會提示No identifier specified或does not define an IdClass的錯誤。
下面以使用者部門關係進行舉例說明,使用者和部門是多對多的關係。
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; /** * 聯合主鍵使用者ID */ @Column(name = "member_id", length = 20) private long memberId; /** * 聯合主鍵部門ID */ @Column(name = "dept_id", length = 20) private long deptId; }
觀察以上程式碼似乎並沒有什麼問題,但在啟動專案時會提示以下錯誤:
Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.test.po.MemberDeptPO
此時需要在聯合主鍵欄位memberId和deptId上增加@Id註解即可解決以上錯誤。這裡需要注意的是,一般出現以上錯誤提示時只要在主鍵欄位上增加@Id註解即可解決問題。
但再次啟動專案時還是會提示一個does not define an IdClass的錯誤:
Caused by: java.lang.IllegalArgumentException: This class [class com.test.po.MemberDeptPO] does not define an IdClass
這是因為聯合主鍵時需要額外定義一個idClass類作為實體的ID,idClass類程式碼如下:
/** * 使用者部門關係聯合主鍵定義 * @author lizebin * @version 1.0 * @date 2021/2/18 10:36 上午 * **/ @Getter @Setter public class MemberDeptKey implements Serializable { private static final long serialVersionUID = -5482200454871393530L; /**聯合主鍵,欄位名稱與MemberDeptPO 類中一致*/ private long memberId; /**聯合主鍵,欄位名稱與MemberDeptPO 類中一致*/ private long deptId; public MemberDeptKey() { } public MemberDeptKey(long memberId, long deptId) { this.memberId = memberId; this.deptId = deptId; } }
說明:MemberDeptKey類中的欄位必須為MemberDeptPO類中的聯合主鍵且欄位名稱需保持一致。
增加@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) // 定義聯合主鍵類 public class MemberDeptPO implements Serializable{ private static final long serialVersionUID = 1271571231859316736L; /** * 聯合主鍵使用者ID */ @Id // 定義該欄位為主鍵 @Column(name = "member_id", length = 20) private long memberId; /** * 聯合主鍵部門ID */ @Id // 定義該欄位為主鍵 @Column(name = "dept_id", length = 20) private long deptId; }
@Repository public interface IMemberDeptRepository extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> { }
由於這裡使用類聯合主鍵,上面程式碼中的ID不能在使用Long而是需要使用MemberDeptKey進行定義,最終程式碼如下:
@Repository public interface IMemberDeptRepository extends JpaRepository<MemberDeptPO, MemberDeptKey>, JpaSpecificationExecutor<MemberDeptPO> { /**通過ID獲取資料資訊*/ MemberDeptPO findById(MemberDeptKey id); }
當需要通過ID獲取資料時則如下呼叫即可:
@Autowired private IMemberDeptRepository memberDeptRepository; MemberDeptPO memberDeptPO = memberDeptRepository.findById(new MemberDeptKey(1l, 0l));
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45