我有一个m:n关系书 - 借用 - 用户,借用是连接表.
表格给出(不能更改):
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哪个足够多?
看看更多的图片:

首先,由于借用表是纯连接表,因此根本不需要映射它.您只需要使用此借用表作为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是指:该关联是双向一对多/多对一关联,这已经由场映射的逆侧user的BorrowEntity实体.请参阅此字段的注释以了解如何映射关联.
所以@JoinColumn没有意义.这与之相矛盾mappedBy.您只需要以下内容:
@OneToMany(mappedBy="user")
private List<BorrowEntity>borrowings;
Run Code Online (Sandbox Code Playgroud)
targetEntity也是多余的,因为它是List<BorrowEntity>:JPA可以从列表的泛型类型推断目标实体.