我有这种情况,我想知道我是否可以使用 JPA ,同时多对一和一对多关系,
我有一个图书馆,其中包含图书(一对多)的列表,因此我可以在一个图书中插入一个图书的文库
同时我想更新 图书说现在它属于另一个图书馆只是更新图书 >信息(因此它将其从库中删除,然后将其放入另一个中)
这是否可以使用 JPA 注释?
提前谢谢!
答案 0 :(得分:1)
您可以在mappedBy
中使用@OneToMany
,例如:
@Entity
class Book {
@ManyToOne
Library library
}
@Entity
class Library {
@OneToMany(mappedBy='library')
List<Book> books
}
要添加新对象,您可以使用以下内容:
Library library1 = new Library()
em.persist(library1)
Book book1 = new Book()
book1.library = library1
em.persist(book1)
Book book2 = new Book()
book2.library = library1
em.persist(book2)
对于@OneToMany
方,您仍然可以从books
检索library
,例如:
// in transaction
Library library = findLibraryById(1)
println library.books.size() // output: 2
然后,您只需为library
设置新值即可更改Book
library
,例如:
// in transaction
Library library2 = new Library()
em.persist(library2)
Book book = c.findBookById()
book.library = library2
更新:如果你想坚持一个操作,你可以在映射中使用cascade
(不是真的推荐!),例如:
@ManyToOne(cascade=CascadeType.ALL)
Library library
现在Book
上的操作将级联到Library
,例如,创建Book
也会创建其Library
:
Library libraryA = new Library()
Book book = new Book()
book.library = libraryA
em.persist(book)
请注意JPA不会为您保留Library.books
的内存状态。您应手动将Book
添加到Library.books
,或重新执行查询以获取Library
的最新状态。
另一个缺点是Book
必须知道它属于哪个Library
。这不应该是Book
的责任。这将使未来的维护更加困难。例如,如果您决定将Book
存储在BookRack
而不是Library
,则您需要同时更改Book
和Library
。