我有两个具有双向关系的实体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中取错了“title”字段?
有没有办法用单一请求来保存数据,或者我总是要先保留作者,然后用“作者”这样的HAL格式保存书籍:“http://.../createdAuthorId”?
答案 0 :(得分:1)
办公室指南https://docs.spring.io/spring-data/rest/docs/3.0.5.RELEASE/reference/html/#_related_resources_2
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String title;
@ManyToOne(cascade = CascadeType.PERSIST)
@RestResource(exported = false)
private Author author;
}
小心我在作者属性中添加注释:@RestResource(exported = false)
作者实体不应修改任何代码
你可以像这样级联持久作者
{
"title": "Some title",
"author": {
"title": "Mr",
"name": "John Doe"
}
}