JPA中多對多表關係的刪除操作,如何刪除放棄維護關聯關係的一方和中間表的紀錄
阿新 • • 發佈:2018-12-04
資料庫中的表
使用者表:在配置實體類的時候放棄了維護關聯關係的權利
角色表:
中間表:
需求:刪除t_user表中的user_id 為1的使用者,並刪除相關的中間表紀錄。
程式碼:
@Test public void testRemove() { EntityManager manager = JPAUtil.createEntityManager(); EntityTransaction tx = manager.getTransaction(); tx.begin(); // 找到需要刪除的物件 SysUser u1 = manager.find(SysUser.class, 1L); /* * 首先解除SysRole物件和這個物件的關係(誰關聯了就移除) */ // 和 u1 有關係的 SysRole Set<SysRole> roles = u1.getRoles(); // 解除關係 roles.forEach(role -> role.getUsers().remove(u1)); // 為了容易理解,這裡加上更新;不加的話,由於快取和快照的不同也會更新 roles.forEach(role -> manager.merge(role)); // 和 u1 有關係的角色已經解除了關係,可以進行刪除 u1 了,就像刪除單表一樣 manager.remove(u1); tx.commit(); manager.close(); }
需求:只刪除中間表的紀錄,刪除user_id 為1的中間表的紀錄
這個操作上面已經涉及到了,就是解除關聯關係,然後更新相應的實體即可。
@Test public void removeRelationOnly() { // 上面沒有說,JPAUtil是一個簡單的小工具,用於生成表結構和得到EntityManager的 EntityManager manager = JPAUtil.createEntityManager(); EntityTransaction tx = manager.getTransaction(); tx.begin(); // 查到相關的實體 SysUser u1 = manager.find(SysUser.class, 1L); /* * 其實刪除中間表的紀錄,就是解除關聯關係 */ // 得到 和 u1關聯的SysRole Set<SysRole> roles = u1.getRoles(); // 解除和 u1 的關係 roles.forEach(role -> role.getUsers().remove(u1)); // 手動更新就省了 tx.commit(); manager.close(); }