【发布时间】:2017-03-30 19:27:31
【问题描述】:
我有两个具有双向关系 OtM MtO 的实体。我也使用级联 PERSIST,因为我想一次持久化数据。
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String title;
@ManyToOne(cascade = CascadeType.PERSIST)
private Author author;
}
@Entity
public class Author {
@Id
@GeneratedValue
private Long id;
private String title; //mr, mrs
private String name;
@OneToMany(mappedBy = "author")
private List<Book> books;
}
我首先创建了 BookRepository 并使用 Spring Data REST 公开它。
@RepositoryRestResource
public interface BookRepository extends JpaRepository<Book, Long>{
}
当我使用 JSON 发送 POST 请求时:
{
"title": "Some title",
"author": {
"title": "Mr",
"name": "John Doe"
}
}
一切正常,书籍和作者实体都被持久化。现在我想公开有关作者的数据,所以我添加了另一个存储库:
@RepositoryRestResource
public interface AuthorRepository extends JpaRepository<Author, Long> {
}
现在,当我发送相同的 JSON 时,书籍实体会被持久化,但作者实体不会。更重要的是,书名现在是“先生”。
我不明白这种奇怪的行为。为什么使用单个存储库一切正常,但是在添加另一个存储库之后,Spring 不仅没有保留相关的作者实体,而且它从我发送的 JSON 中获取了错误的“标题”字段?
有没有办法通过单个请求来持久化数据,或者我总是必须先持久化作者,然后用 HAL 格式(如“作者”:“http://.../createdAuthorId”)持久化书籍?
【问题讨论】: