Cascade坚持使用Spring Data REST

时间:2016-11-16 14:36:24

标签: spring spring-data-rest

我有两个具有双向关系的实体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”?

1 个答案:

答案 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"
     }
}