Spring Data Rest为什么只允许从ManyToOne / ManyToMany的所有者方进行更新?

ero*_*ppa 5 spring hibernate jpa spring-data spring-data-rest

我从这里https://www.baeldung.com/spring-data-rest-relationships下载了一个示例项目

然后,我运行它并进行了一些测试REST调用。据我所知,您只能使用SDR从所有者方更新关联。我的意思是

public class Book {
    @ManyToOne
    @JoinColumn(name = "library_id")
    private Library library;
}
Run Code Online (Sandbox Code Playgroud)

public class Library {
    @OneToMany(mappedBy = "library")
    private List<Book> books;
}
Run Code Online (Sandbox Code Playgroud)

您实际上无法对/ libraries / 1 / books进行发布/发布调用。服务器返回204,但对数据库没有任何影响。

但是,您可以对/ books / 1 / library进行post / put调用,一切都会按预期进行,包括使另一个实体保持同步。

这正常吗?@ManyToMany的行为也相同。有没有办法允许双方进行更新?如果我编写自己的API,我当然可以解决。SDR为什么不这样做?

cri*_*zis 3

这是正常的吗?

从某种意义上说,是的。Book这正是当您将 a 添加到当前映射的集合中时纯 JPA 的行为方式Library.books- 它不会进行任何更改。

我的猜测是,Spring Data Rest 不知道(或关心)关联的哪一侧是所有者一侧,并且只是没有付出额外的努力来确保更新反面也能正常工作。

有没有办法允许双方更新?

解决方法可能是简单地假装协会双方都是拥有方,即:

public class Library {

    @OneToMany
    @JoinColumn(name = "library_id")
    private List<Book> books;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这使得 Hibernate 将Library.booksBook.library视为两个完全独立的关联。在某些极端情况下,您的实体可能不会按照您期望的方式运行。你被警告了。