Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息并通过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中,则需要同时更改BookLibrary

关于java - 一对多和多对一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22883623/

10-11 23:15
查看更多