Отношения M:N в JPA (обертывание данных таблиц)

У меня есть отношение m:n книга — заимствование — пользователь, заимствование — это таблица соединения.

Таблицы даны (изменениям не подлежат):

  • с одной стороны, они также используются приложением jdbc.
  • с другой стороны, я хотел бы использовать их через 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;

Моя проблема заключается в том, что указанные выше настройки добавляют дополнительные (нежелательные) поля в таблицу заимствований:

'user_USER_ID' и 'book_BOOK_ID'

Как я могу настроить аннотации jpa, чтобы оставить только Borrow:user_id,book_id, что достаточно для многих к одному?

Взгляните на картинку, которая говорит больше:

прокат книг


person cscsaba    schedule 21.07.2012    source источник


Ответы (1)


Прежде всего, поскольку таблица заимствования является чистой таблицей соединений, вам вообще не нужно ее отображать. Все, что вам нужно, это ассоциация ManyToMany, использующая эту таблицу заимствования как 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;

Если вы действительно хотите отобразить таблицу соединений как сущность, она должна содержать две ассоциации 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 может вывести целевой объект из общего типа списка.

person JB Nizet    schedule 22.07.2012