0

我们总能做到:

EntityA @OneToOne EntityB

@OneToOne
@JoinTable(name="table_name")
private EntityB b;

你将会怎样 ?

EntityC @OneToMany EntityD (但这次我也有关于 join 的 EntityType 信息)

但是如果你有relationship相关的属性呢?

喜欢:

EntityC  -- JoinTable -- EntityD
                |
                |
              EntityType

现在在这种情况下,我的连接表有 3 个 id ( EntityC_id, EntityType_id, EntityD_id)

如何创建与EntityC and EntityD(With EntityType) 的关联?

4

1 回答 1

2

我相信标准的方法是创建一个实体JoinTable,用@OnetoMany你的引用EntityCEntityD. JoinTable然后有自己的反向@ManyToOne引用。例如(来自JPA wikibook on M:N with additional columns):

@Entity
public class EntityC {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="entityC")
  private List<JoinTable> entityDs;
  ...
}

@Entity
public class EntityD {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="entityD")
  private List<JoinTable> entityCs;
  ...
}

然后将您的关联表作为一个单独的实体进行管理,将这两个实体相互映射:

@Entity
@IdClass(JoinTableId.class)
public class JoinTable {
  @Id
  private long entityCId;
  @Id
  private long entityDId;
  ...
  private int entityTypeId;     //your relationship-attribute
  ...
  @ManyToOne
  @JoinColumn(name="entityCId", referencedColumnName="id", updatable="false", insertable="false")
  private EntityC entityC;
  @ManyToOne
  @JoinColumn(name="entityDId", referencedColumnName="id", updatable="false", insertable="false")
  private EntityD entityD;
  ...
}

public class JoinTableId implements Serializable {
    private long entityCId;
    private long entityDId;
    ...
    //hashCode()
    //equals(...)
}

请注意,这因其跨JoinTable类及其 id 类的 id 字段的重复和冗余而受到批评,这是 JPA 所要求的。请参阅Giannigar 的博客以获取替代建议(带学分)。

注意我已经手工编辑了很多,所以对任何错别字深表歉意。

于 2013-09-11T12:06:10.073 回答