5

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

给出的表格(不能更改):

  • 一方面,它们也被 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 注释以仅保留 Borrow:user_id,book_id 这足以多对一?

看一下图片,它说明了更多:

借书

4

1 回答 1

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 可以从列表的泛型类型推断目标实体。

于 2012-07-22T08:49:04.703 回答