我从这里下载了一个示例项目 https://www.baeldung.com/spring-data-rest-relationships
然后我运行它并做了一些测试 REST 调用。据我所知,您只能使用 SDR 从所有者端更新关联。我的意思是
public class Book {
@ManyToOne
@JoinColumn(name = "library_id")
private Library library;
}
和
public class Library {
@OneToMany(mappedBy = "library")
private List<Book> books;
}
您实际上无法对/libraries/1/books 进行 post/put 调用。服务器返回 204 但对数据库没有任何影响。
但是,您可以对/books/1/library 进行 post/put 调用,一切都按预期工作,包括保持其他实体同步。
这是正常的吗? @ManyToMany 也是同样的行为。有没有办法允许双方更新?如果我编写自己的 API,我当然可以做到这一点。为什么 SDR 不这样做?
最佳答案
Is this normal?
从某种意义上说,是的。这正是添加
Book
时纯 JPA 的行为方式。到收藏Library.books
使用您当前的映射 - 它不会做任何更改。我的猜测是 Spring Data Rest 不知道(或关心)关联的哪一侧是所有者一侧,并且只是没有加倍努力确保更新反向侧也能正常工作。
Is there a way to allow for updates from both sides?
一种解决方法可能是简单地假装关联的双方都是拥有方,即:
public class Library {
@OneToMany
@JoinColumn(name = "library_id")
private List<Book> books;
}
请注意,这会使 Hibernate 处理
Library.books
和 Book.library
作为两个完全独立的协会。在某些极端情况下,您的实体可能不会按照您期望的方式行事。你被警告了。
关于spring - 为什么 Spring Data Rest 只允许来自 ManyToOne/ManyToMany 的所有者端的更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685582/