【发布时间】:2015-08-08 11:53:16
【问题描述】:
使用 Spring Data REST,如果您有 OneToMany 或 ManyToOne 关系,则 PUT 操作会在“非拥有”实体上返回 200,但实际上不会持久化连接的资源。
示例实体:
@Entity(name = 'author')
@ToString
class AuthorEntity implements Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
String fullName
@ManyToMany(mappedBy = 'authors')
Set<BookEntity> books
}
@Entity(name = 'book')
@EqualsAndHashCode
class BookEntity implements Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
@Column(nullable = false)
String title
@Column(nullable = false)
String isbn
@Column(nullable = false)
String publisher
@ManyToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL])
Set<AuthorEntity> authors
}
如果您使用PagingAndSortingRepository 支持他们,您可以获取Book,点击本书上的authors 链接并使用要关联的作者的URI 执行PUT。你不能走另一条路。
如果您对作者执行 GET 并对其 books 链接执行 PUT,则响应返回 200,但关系永远不会持续存在。
这是预期的行为吗?
【问题讨论】:
-
双向关联必须在对象模型中手动维护,这通常在设置器中完成。 Spring Data REST 默认使用字段访问。这意味着根据定义,关联的变化不会反映在关联的另一端。您是否尝试过在
@PrePersist/@PreUpdate方法中触发同步?还是切换到属性访问? -
我也会投票解决双向关联问题。
Author可以在没有Book的情况下存在。可以使用存储库方法Set<Book> BookRepository.findByAuthor(Author author)检索Books 的Author。这大大简化了模型,因为您不必手动维护引用。 -
我可以看到一个图书馆界面,您需要在其中找到作者,然后查看它的书籍。如果没有双向关联,这将不受支持。如果不是 DATA REST 的意图,则不喜欢管理实体关联。感谢您的输入,过滤作者的书籍似乎是最好的方法。尽可能不要让事情单向。 :)
标签: java spring-boot spring-data spring-data-jpa spring-data-rest