M:N relationship in JPA (wrapping given tables)
jpa, many-to-one
Solution
First of all, since the borrow table is a pure join table, you don't need to map it at all. All you need is a ManyToMany association using this borrow table as JoinTable.
@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;
If you really want to map the join table as an entity, then it should contain two ManyToOne associations (one for each foreign key). So the following is wrong:
@OneToMany(targetEntity=BorrowEntity.class, mappedBy="user")
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
private List<BorrowEntity>borrowings;
Indeed, `mappedBy` means: this association is the inverse side of the bidirectional OneToMany/ManyToOne association, which is already mapped by the field `user` in the `BorrowEntity` entity. Please see the annotations on this field to know how to map the association.
So the `@JoinColumn` doesn't make sense. It's in contradiction with `mappedBy`. You just need the following:
@OneToMany(mappedBy="user")
private List<BorrowEntity>borrowings;
The targetEntity is also superfluous, since it's a `List<BorrowEntity>`: JPA can infer the target entity from the generic type of the list.
Problem
I have a m:n relationship book - borrow - user, the borrow is the join table. The tables are given (can not be changed): - on one side they are used by jdbc app as well. - on the other side i would like to use them via jpa book(book_id) - borrow(book_id,used_id) - user(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; ``` My problem is that by the settings above it adds some extra (undesired) fields to the borrow table: 'user_USER_ID' and 'book_BOOK_ID' How can I configure the jpa annotations to keep just Borrow:user_id,book_id which is enough the many to one ? Take a look at the picture which tells more: