一对多,多对一

时间:2014-04-05 16:32:14

标签: java jpa

我有这种情况,我想知道我是否可以使用 JPA ,同时多对一一对多关系,
我有一个图书馆,其中包含图书一对多)的列表,因此我可以在一个图书中插入一个图书文库
同时我想更新 图书说现在它属于另一个图书馆只是更新图书 >信息(因此它将其从中删除,然后将其放入另一个中) 这是否可以使用 JPA 注释?
提前谢谢!

1 个答案:

答案 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,则您需要同时更改BookLibrary