【问题标题】:Spring Data JPA/REST Update subcollectionSpring Data JPA/REST 更新子集合
【发布时间】:2017-07-24 12:01:24
【问题描述】:

我有一个 Spring Data Jpa/Rest Web 应用程序。

我创建了两个实体,A 和 B,其中实体 A 包含多个 B 实体。

DTO 类定义为:

Getter/Setter 被省略。

@Entity
public class A implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany
    @JoinColumn(name = "a_id")
    private List<B> b = new LinkedList<>();
}

@Entity
public class B implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String bType;
}

各个存储库扩展了 PagingAndSortingReposity。

目前,为了创建 A 类型的记录,我创建了一组指向其子实体(即 Bs)的链接。它工作正常,但是当我尝试更新记录时,我发现使用相同的方法只更新 json 的第一级,其余保持不变。

我的问题是:如何将实体 A 与新的实体 B 集合一起更新。

【问题讨论】:

  • 应设置级联类型:vladmihalcea.com/2015/03/05/… 例如:@OneToMany(cascade = CascadeType.ALL)
  • 是的,我已经添加了。据我了解,当 B 实体添加到 A 时,它应该会自动创建它们。但是,我无法以这种方式创建它们。这就是为什么我首先必须分别创建它们中的每一个,然后在创建 A 时将一组链接传递给 B 实体。
  • 我已经设置了一个测试来模拟你的情况,它似乎有效。您的存储库是否扩展了 JpaRepository(或只是 PagingAndSortingRepository)?

标签: java spring hibernate rest jpa


【解决方案1】:

A 类有一对多映射

所以在 b 类中,必须有这样的多方同步

@JoinColumn(name = "A_ID", referencedColumnName = "ID")
@ManyToOne
private A aID;

如果您添加这些行 并在@ManyToOne中添加CascadeType.ALL

合并父实体的更改也会反映到子表中。

【讨论】:

  • 如果他不需要双向关系,那么非拥有方就没有ManyToOne
【解决方案2】:

经过大量搜索,我得到了一位导师和互联网的帮助。

由于我正在使用关联资源,因此无法以这种方式完成任务。后端 Java 应用程序似乎配置正确。

要更新应用程序的内容,需要将 content-type 设置为 the official documentation 中列出的 text/uri-list 并简单地发送一个带有每个子对象链接的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多