Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
6年前关闭。
Improve this question
我有这种情况,我想知道是否可以使用JPA做到这一点,同时建立一对多和一对多的关系,
我有一个图书馆,里面有一本书的清单(一对多),所以我可以在图书馆里插入一本书
同时,我想更新一本书,说它现在属于另一个图书馆,只是在更新书籍信息(因此它将其从图书馆中删除,并将其放入另一个图书馆中)。
使用JPA注释可以吗?
提前致谢!
要添加新对象,可以使用以下方法:
对于
然后,只需为
更新:如果要坚持执行一项操作,可以在映射中使用
现在,对
请注意,JPA不会为您维护
另一个缺点是
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
6年前关闭。
Improve this question
我有这种情况,我想知道是否可以使用JPA做到这一点,同时建立一对多和一对多的关系,
我有一个图书馆,里面有一本书的清单(一对多),所以我可以在图书馆里插入一本书
同时,我想更新一本书,说它现在属于另一个图书馆,只是在更新书籍信息(因此它将其从图书馆中删除,并将其放入另一个图书馆中)。
使用JPA注释可以吗?
提前致谢!
最佳答案
您可以在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
。关于java - 一对多和多对一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22883623/