我相信标准的方法是创建一个实体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 的博客以获取替代建议(带学分)。
注意我已经手工编辑了很多,所以对任何错别字深表歉意。