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

csc*_*aba 5 jpa many-to-one

我有一个m:n关系书 - 借用 - 用户,借用是连接表.

表格给出(不能更改):

  • 一方面它们也被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;
Run Code Online (Sandbox Code Playgroud)

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

'user_USER_ID'和'book_BOOK_ID'

我怎样才能配置jpa注释以保持Borrow:user_id,book_id哪个足够多?

看看更多的图片:

书借

JB *_*zet 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;
Run Code Online (Sandbox Code Playgroud)

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

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

实际上,mappedBy是指:该关联是双向一对多/多对一关联,这已经由场映射的逆侧userBorrowEntity实体.请参阅此字段的注释以了解如何映射关联.

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

@OneToMany(mappedBy="user")
private List<BorrowEntity>borrowings;
Run Code Online (Sandbox Code Playgroud)

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