我有两个实体,Shelf和Book。货架可以有多本书(关系是双向的)。我把这两个都暴露为JpaRepositories。
问题在于:
我可能缺少什么想法?
现在我通过在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。
答案 0 :(得分:3)
在您的Shelf实体中,将mappedBy = "self"
属性添加到书籍中的@OneToMany
注释中:
@OneToMany(mappedBy = "self")
private List<Book> books = new ArrayList<Book>();
这将使用引用self
匹配的图书自动填充图书清单。
答案 1 :(得分:0)
我认为您需要更新书架以添加您创建的新书作为最后一步。这是因为你使用的是双向关系,而且书架在你用它应该保存的书籍更新之前根本不知道书籍。