spring - 为什么 Spring Data Rest 只允许来自 ManyToOne/ManyToMany 的所有者端的更新?

标签 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;
}


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.booksBook.library作为两个完全独立的协会。在某些极端情况下,您的实体可能不会按照您期望的方式行事。你被警告了。

关于spring - 为什么 Spring Data Rest 只允许来自 ManyToOne/ManyToMany 的所有者端的更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685582/

相关文章:

java - 为什么我的依赖 Spring bean 被实例化了两次?一次来自 jar 依赖项,一次来自类路径

java - 配置 Spring 4.1 O/X 映射以基于模式验证入站 XML?

java - Swagger 引用对 Spring 对象的响应,使用 Swagger 进行分页

spring - 严重 : StandardWrapper. 可抛出

java - Spring Boot - 配置了两个数据源 - 如何使用第二个数据源?

java - 使用附加参数重写无状态 Spring 服务中的方法

hibernate - 为类 classname 提供了错误类型的 id 预期为 : class java. lang.Integer,得到了类 java.lang.String

java - 当我尝试使用 hibernate 将字段插入表时出错

java - Spring-Data-Jpa 在持久化后清除链接实体的所有参数

java - jpa中的范围查询