通过联接表在JPA实体关系上的其他“外部”联接列

时间:2019-12-23 21:07:27

标签: hibernate jpa

我有两个通过联接表关联的实体,使用JPA建模,如下所示:

class EntityA {

  @ManyToMany
  @JoinTable(name="joining_entity",
    joinColumns={@JoinColumn(name="entity_a_id", referencedColumnName="id")},
    inverseJoinColumns={@JoinColumn(name="entity_b_id", referencedColumnName="id")}
  )
  List<EntityB> entityBList;

  Long importantIdentifier;

}

class EntityB {

  @ManyToMany(mappedBy="entityBList")
  List<EntityA> entityAList;

  Long importantIdentifier;

}

这对于简单的多对多关系很好,但就我而言,我也只需要在两个实体中importantIdentifier匹配时才加入。

对于临时查询,这仅是在联接中添加ON子句的问题:AND entity_a.important_identifier=entity_b.important_identifier

但是,我正在努力用JPA / Hibernate注释对此建模。我尝试过:

  • @JoinColumn一起添加一个额外的@JoinTable-这将被忽略
  • 添加@Where@WhereJoinTable注释-不幸的是,似乎没有一种方法可以引用外部表/实体,仅可以引用联接表

如果还有另一种方法可以实现,即使用某种方法使用代表连接表的第三个具体实体,我就不会习惯使用@JoinTable

1 个答案:

答案 0 :(得分:2)

此建模将为您提供所需的灵活性。为第三个实体建立模型,称为RelationalAB,并将EntityA和EntityB的模型从@ManyToMany更改为@OneToMany。在您的新的RelationalAB模型中,我将为EntityA和EntityB具有两个@ManytoOne映射:`示例:

@Entity
@Table(name = "RELATIONAL_A_B")
public class relationalAB {

    @Id
    @GeneratedValue
    @Column(name="RELATIONAL_A_B_ID")
    protected Integer id;


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "enitityA_id", insertable = false, updatable = false)
    protected EntityA entityA;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "enitityB_id", insertable = false, updatable = false)
    protected EntityB entityB;
    ...

@Entity
@Table(name = "ENTITY_A")
public class EntityA {

    @Id
    @GeneratedValue
    @Column(name="ENTITY_A_ID")
    protected Integer id;


    @OneToMany(mappedBy = "entityA", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY)
    List<relationalAB> weakEnityList;

    ...

@Entity
@Table(name = "ENTITY_B")
public class EntityB {

    @Id
    @GeneratedValue
    @Column(name="ENTITY_B_ID")
    protected Integer id;

    @OneToMany(mappedBy = "entityB", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY)
    List<relationalAB> weakEnityList;

    ...`