我有两个通过联接表关联的实体,使用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
。
答案 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;
...`