JPA:如何将实体与关系属性相关联?

时间:2013-09-11 10:59:10

标签: java spring hibernate jpa orm

我们总能做到:

EntityA @OneToOne EntityB

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

你好吗?

EntityC @OneToMany EntityD(但这次我还有关于加入的EntityType信息)

但是如果你有relationship个属性会怎样呢?

像:

EntityC  -- JoinTable -- EntityD
                |
                |
              EntityType

现在,在这种情况下,我的联接表有3个ID(EntityC_id, EntityType_id, EntityD_id

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

1 个答案:

答案 0 :(得分:2)

我认为标准方法是使用JoinTable@OnetoMany创建一个代表EntityC且带有EntityD引用的实体。 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's blog 以获取替代建议(带信用)。

N.B。我亲自编辑了很多这样的道歉,对任何错别字道歉。