2012-07-21 70 views
5

我有一个m:n关系book - borrow - user,借用是连接表。JPA中的M:N关系(包装给定表格)

这些表中给出(不能改变):

  • 在一侧上它们通过JDBC应用使用。
  • 在另一边我想通过JPA使用它们

书(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注释以保持只有借用:user_id,book_id这对多对一来说足够了?

看看它告诉更多图片:

所有的

book borrowing

回答

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; 

如果你真的想映射连接表作为一个实体,那么它应该包含两个多对一协会(每个外键)。所以下面是错误的:

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

事实上,mappedBy意思是:这个协会是双向的一对多/多对一的关联,这已经是由现场userBorrowEntity实体映射的逆侧。请参阅此字段上的注释以了解如何映射关联。

所以@JoinColumn没有意义。这与mappedBy相矛盾。你只需要:

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

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

+0

感谢您的帮助! – cscsaba 2012-07-22 13:20:29