2012-07-21 27 views
5

Tengo m: n relación libro - borrow - user, el préstamo es la tabla de unión.Relación M: N en JPA (ajuste de tablas)

Las tablas se dan (no se pueden modificar):

  • en un lado que son utilizados por aplicación JDBC también.
  • en el otro lado me gustaría usarlos a través de APP

libro (book_id) - prestado (book_id, used_id) - usuario (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; 

Mi problema es que por los ajustes anteriores se agrega algunos campos adicionales (no deseados) a la mesa de préstamo:

'user_USER_ID' y 'book_BOOK_ID'

¿Cómo puedo configurar las anotaciones jpa para mantener solo Borrow: user_id, book_id, que es suficiente de varios a uno?

Tome un vistazo a la imagen que dice más:

book borrowing

Respuesta

7

En primer lugar, ya que la mesa de préstamo es una pura tabla de unión, que no es necesario hacer un mapa en absoluto. Todo lo que necesita es una asociación ManyToMany que use esta tabla de préstamos como 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; 

Si realmente desea asignar la tabla de unión como una entidad, entonces debería contener dos asociaciones ManyToOne (uno para cada clave externa). Por lo que el siguiente es incorrecto:

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

De hecho, mappedBy significa: esta asociación es el lado inverso de la asociación OneToMany/ManyToOne bidireccional, que ya está asignado por el campo user en la entidad BorrowEntity. Consulte las anotaciones en este campo para saber cómo asignar la asociación.

Por lo tanto, el @JoinColumn no tiene sentido. Está en contradicción con mappedBy. Sólo se necesita lo siguiente:

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

El targetEntity también es superflua, ya que es un List<BorrowEntity>: JPA puede inferir la entidad de destino en el tipo genérico de la lista.

+0

¡Gracias por su ayuda! – cscsaba

Cuestiones relacionadas