我们总能做到:
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)的关联?
答案 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。我亲自编辑了很多这样的道歉,对任何错别字道歉。