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」

Borrow:user_id,book_id だけを保持するように jpa 注釈を構成するにはどうすればよいですか?

詳細を伝える写真を見てください:

本を借りる

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;

結合テーブルをエンティティとしてマッピングする場合は、2 つの ManyToOne アソシエーション (各外部キーに 1 つ) を含める必要があります。したがって、次は間違っています。

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

実際、mappedByこの関連付けは、双方向の OneToMany/ManyToOne 関連付けの逆側でありuserBorrowEntityエンティティのフィールドによって既にマップされていることを意味します。関連付けをマッピングする方法については、このフィールドの注釈を参照してください。

だから、@JoinColumn意味がありません。と矛盾していmappedByます。次のものが必要です。

@OneToMany(mappedBy="user")
private List<BorrowEntity>borrowings;

: JPAList<BorrowEntity>は、リストのジェネリック型からターゲット エンティティを推測できます。

于 2012-07-22T08:49:04.703 に答える