【问题标题】:Cascade persist with Spring Data REST级联与 Spring Data REST 保持一致
【发布时间】: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”)持久化书籍?

【问题讨论】:

    标签: spring spring-data-rest


    【解决方案1】:

    请参阅office guide。举个例子:

    @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) 添加到author 属性中。

    不应修改Author 实体。

    你可以像这样级联持久化author

    {
        "title": "Some title",
        "author": {
            "title": "Mr",
            "name": "John Doe"
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2021-12-27
      • 2016-10-26
      • 1970-01-01
      • 2023-02-23
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多