美文网首页
JPA多对多级联删除中间表

JPA多对多级联删除中间表

作者: 裸奔的刺猬 | 来源:发表于2020-06-12 14:59 被阅读0次

PS:禁止拷贝形式转载,转载请以URL形式

1.简介

解决JPA/hibernate 实体多对多关系下,操作实体无法直接级联删除中间表,报错。

2.环境

  1. jdk1.8
  2. springboot:2.2.8.RELEASE

3.解决思路

  1. 正常多对多
  • 实体A使用多对多关联(@ManyToMany)关联B,JPA自动生成第三张中间表C,
  • 然后在需要删除实体并且级联删除中间表时,提前删除中间表C的关联数据。
  1. 双向一对多
  • 实体A使用双向一对多(@OneToMany)关联C,并且设置C为维护方;
  • 实体B使用双向一对多(@OneToMany)关联C,并且设置C为维护方;
  • 通过JPA任意删除A/B都会删除中间表数据C,而不会删除另一方

4.代码

4.1 双向一对多实现

实体A

@Data
@Entity
@Table(name = "tb_a")
public class TbA {
    @Id
    @Column(name = "c_uuid", unique = true, length = 36, nullable = false)
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
    private String uuid;
    
    @OneToMany(cascade = {CascadeType.ALL},mappedBy = "a")
    private List<TbC> cList;
}

实体B

@Data
@Entity
@Table(name = "tb_b")
public class TbB {
    @Id
    @Column(name = "c_uuid", unique = true, length = 36, nullable = false)
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
    private String uuid;
    
    @OneToMany(cascade = {CascadeType.ALL},mappedBy = "b")
    private List<TbC> cList;
}

中间表C

@Data
@Entity
@Table(name = "tb_c")
@IdClass(TbC.TbCEmbeddable.class)
public class TbC {
    @Id
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "c_a_foreign_key")
    private TbA a;

    @Id
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "c_b_foreign_key")
    private TbA b;

    @Data
    public static class TbCEmbeddable implements Serializable {
        private TbA a;
        private TbB b;
    }
}

级联删除代码


@NoRepositoryBean
public interface BaseDao<T,ID extends Serializable> extends JpaRepository<T,ID> , JpaSpecificationExecutor<T> {
//RestResource
}

BaseDao<TbCollectManageItem,String> dao = factory.getDao(TbCollectManageItem.class);
        dao.deleteById(uuid);

相关文章

  • JPA多对多级联删除中间表

    PS:禁止拷贝形式转载,转载请以URL形式 1.简介 解决JPA/hibernate 实体多对多关系下,操作实体无...

  • Spring boot data JPA数据库映射关系:@Man

    多对多,用中间表关联,删除中间表的记录,不会对各方的表造成影响。 我们先来看一段例子 @ManyToMany(ca...

  • Java:hibernate框架(3)

    一. 表与表之间的关系 二.Hibernate的一对多操作1.一对多映射配置 2.一对多级联保存 3.一对多的级联...

  • jpa 级联

    jpa级联 对应项里面似乎不用再做处理了 在做级联删除的时候应该@onetomany里面的orphanRemova...

  • SpringBoot Data JPA 关联表查询

    SpringBoot Data JPA实现 一对多、多对一关联表查询 开发环境 IDEA 2017.1Java1....

  • python-Flask_SQLAlchemy(4)

    数据表多对多关系 [TOC] 多对多关系 多对多关系,需要通过一个中间表进行关联 中间表使用db.Table的方式...

  • @OneToMany注解的使用

    假设有两个表,订单表和产品表,订单跟产品的关系是一对多的关系,那么在JPA中怎样表示一对多的关系呢?实体关系一对多...

  • Java学习阶段六【web高级进阶】

    openJpa技术: JPA介绍及开发环境搭建、单表实体映射、一对多/多对一、一对一、多对多关联、实体继承、复合主...

  • 【想法】实体多对多中间表的理解

    多对多这里用一个例子,比如科目和学生的关系,一个科目可以对应多个学生,一个学生可以对应多个科目。 中间表就是‘科目...

  • Jpa级联操作

    Jpa级联操作 级联web记JPA一个问题,Multiple representations of the sam...

网友评论

      本文标题:JPA多对多级联删除中间表

      本文链接:https://www.haomeiwen.com/subject/qwrwzhtx.html