【问题标题】:M:N relationship in JPA (wrapping given tables)JPA 中的 M:N 关系(包装给定的表)
【发布时间】:2012-07-21 21:38:56
【问题描述】:

我有一个m:n关系book - borrow - user,借用的是join table。

表格已给出(不能更改):

  • 一方面它们也被 jdbc 应用程序使用。
  • 另一方面,我想通过 jpa 使用它们

book(book_id) - 借(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;

我的问题是,通过上面的设置,它向借用表添加了一些额外的(不需要的)字段:

“user_USER_ID”和“book_BOOK_ID”

如何配置 jpa 注释以仅保留 Borrow:user_id,book_id 这足以多对一?

看一下图片,了解更多:

【问题讨论】:

    标签: jpa many-to-one


    【解决方案1】:

    首先,由于借用表是一个纯连接表,所以根本不需要映射它。您只需要使用此借用表作为 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 关联的反面,该​​关联已由 BorrowEntity 实体中的字段 user 映射。请查看此字段的注释以了解如何映射关联。

    所以@JoinColumn 没有意义。这与mappedBy 相矛盾。您只需要以下内容:

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

    targetEntity 也是多余的,因为它是 List&lt;BorrowEntity&gt;:JPA 可以从列表的泛型类型推断目标实体。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2020-04-21
      相关资源
      最近更新 更多