成功添加具有父引用的子实体后,子项不会显示在父资源下

时间:2014-11-07 16:02:19

标签: spring-data-rest

我有两个实体,Shelf和Book。货架可以有多本书(关系是双向的)。我把这两个都暴露为JpaRepositories。

问题在于:

  1. 我通过将{“name”:“sci-fi”}发布到/shelves.(success)来创建一个架子
  2. 我通过将{“name”:“mybook”,“shelf”:“localhost:8080 / shelves / 1”}发布到/ books来为该书架创建一本书。 (成功)
  3. 当我收到我刚刚在/ books / 1创建的书时,它与父书架有正确的链接。
  4. 但是当我上架/ 1 /书时,我得到一个空洞的结果,{}!
  5. 我可能缺少什么想法?

    现在我通过在beforeCreate事件中明确地将书添加到其架子上来构建一个解决方法,但看起来这应该是完全没必要的。 (但确实解决了这个问题。)

    @HandleBeforeCreate(Book.class)
    public void handleCreate(Book book) {
      // why is this necessary?
      book.getShelf().getBooks().add(book); 
    }
    

    以下是实体类:

    @Entity
    public class Book {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
    
        private String name;
    
        @ManyToOne
        private Shelf shelf;
    
        public Shelf getShelf() {
        return shelf;
        }
    
        public void setShelf(Shelf shelf) {
        this.shelf = shelf;
        }
    
        public String getName() {
        return name;
        }
    
        public void setName(String name) {
        this.name = name;
        }
    
        @Override
        public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
        }
    
        @Override
        public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Book other = (Book) obj;
        if (name == null) {
            if (other.name != null)
            return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
        }
    }
    
    @Entity
    public class Shelf {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
    
        private String name;
    
        @OneToMany
        private List<Book> books = new ArrayList<Book>();
    
        public List<Book> getBooks() {
        return books;
        }
    
        public void setBooks(List<Book> books) {
        this.books = books;
        }
    
        public String getName() {
        return name;
        }
    
        public void setName(String name) {
        this.name = name;
        }
    
        @Override
        public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
        }
    
        @Override
        public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Shelf other = (Shelf) obj;
        if (name == null) {
            if (other.name != null)
            return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
        }
    
    }
    

    我正在使用Spring Boot 1.1.8。

2 个答案:

答案 0 :(得分:3)

在您的Shelf实体中,将mappedBy = "self"属性添加到书籍中的@OneToMany注释中:

@OneToMany(mappedBy = "self")
private List<Book> books = new ArrayList<Book>();

这将使用引用self匹配的图书自动填充图书清单。

答案 1 :(得分:0)

我认为您需要更新书架以添加您创建的新书作为最后一步。这是因为你使用的是双向关系,而且书架在你用它应该保存的书籍更新之前根本不知道书籍。