M:N关系在JPA中(包装表格)

时间:2012-07-21 21:38:57

标签: jpa many-to-one

我有一个 m:n 关系 book - borrow - user ,借用是连接表。

表格给出(不能更改):

  • 一方面它们也被jdbc app使用。
  • 另一方面我想通过jpa
  • 使用它们

book(book_id) - 借(book_id,used_id) - 用户(user_id)

 used jpa annotations:
 User:
 @OneToMany(targetEntity=BorrowEntity.class, mappedBy="user")
 @JoinColumn(name="USER_ID", referencedColumnName="USER_ID")    
 private List<BorrowEntity>borrowings;

 Book: 
 @OneToMany(targetEntity=BorrowEntity.class, mappedBy="book")
 @JoinColumn(name="BOOK_ID", referencedColumnName="BOOK_ID")
 private List<BorrowEntity>borrowings;

我的问题是,通过上面的设置,它会在借用表中添加一些额外的(不需要的)字段:

'user_USER_ID'和'book_BOOK_ID'

如何配置jpa注释以保持Borrow:user_id,book_id哪个足够多?

看一下更多的图片:

book borrowing

1 个答案:

答案 0 :(得分:7)

首先,由于借用表是纯连接表,因此根本不需要映射它。您只需要使用此借用表作为JoinTable的ManyToMany关联。

@ManyToMany
@JoinTable(name = "borrow",
           joinColumns = @JoinColumn(name = "USER_ID"),
           inverseJoinColumns = @JoinColumn(name = "BOOK_ID"))
private List<Book> borrowedBooks;
...

@ManyToMany(mappedBy = "borrowedBooks")
private List<User> borrowingUsers;

如果您确实要将连接表映射为实体,那么它应该包含两个ManyToOne关联(每个外键一个)。所以以下是错误的:

@OneToMany(targetEntity=BorrowEntity.class, mappedBy="user")
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")    
private List<BorrowEntity>borrowings;

实际上,mappedBy表示:此关联是双向OneToMany / ManyToOne关联的反面,它已由user实体中的字段BorrowEntity映射。请参阅此字段的注释以了解如何映射关联。

所以@JoinColumn没有意义。这与mappedBy相矛盾。您只需要以下内容:

@OneToMany(mappedBy="user")
private List<BorrowEntity>borrowings;

targetEntity也是多余的,因为它是List<BorrowEntity>:JPA可以从列表的泛型类型中推断出目标实体。