我有一个 m:n 关系 book - borrow - user ,借用是连接表。
表格给出(不能更改):
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;
我的问题是,通过上面的设置,它会在借用表中添加一些额外的(不需要的)字段:
'user_USER_ID'和'book_BOOK_ID'
如何配置jpa注释以保持Borrow:user_id,book_id哪个足够多?
看一下更多的图片:
答案 0 :(得分: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可以从列表的泛型类型中推断出目标实体。