spring-data-jpa 在Spring Boot 时以特定条件更新数据库数据

nc1teljy  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(325)

我正在尝试更新另一个表中外键数据列表。
场景:
我有A类:

public class A{
    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @OneToMany(mappedBy = "A", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<B> b;
}

我还有一个B类:

public class B  {
    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "a_id", nullable = false)
    private A a;
}

我的目标是:以完美的方式更新B的列表。
示例:
我有表B ID列表:
| 标识符|姓名|识别码(_I)|
| - -|- -|- -|
| 一个|n1号|一个|
| 2个|氮气|一个|
| 三个|三号|一个|
| 四个|四号|2个|
| 五个|五号|一个|
| 六个|六号|三个|
我有以下列表需要更新:

[n3,n9,n2,n7,n8]

对于a_id = 1,必须更新该列表,因此在这种情况下,我有两件事要做:

first : adding n7, n8, n9 (with a_id = 1)
second: remove n1, n5 (because they are not included in the list above)

我的预期输出:
| 标识符|姓名|识别码(_I)|
| - -|- -|- -|
| 2个|氮气|一个|
| 三个|三号|一个|
| 四个|四号|2个|
| 六个|六号|三个|
| 七个|七号|一个|
| 八个|八号|一个|
| 九个|九号|一个|
我们怎样才能以最好的方式达到这个结果呢?

zynd9foi

zynd9foi1#

使用下面的Map,只合并/保存A实体,Hibernate将负责删除/持久化/更新。

public class A {
    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL)
    @JoinColumn(name = "a_id", nullable = false)
    private List<B> b;
}

public class B {
    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;
}

如果您希望在B中保留a关联,则必须通过分别为各个B实体调用EntityManager.persist/EntityManager.merge/EntityManager.remove来手动执行持久化/更新/删除操作。

相关问题