我是学生,我是Hibernate框架的新手,我有一个关联类 我想知道如何映射它 情况:
Entity_1[0..\*]-------------------------[0..\*]Entity_2
|
|
|
|
|
Association class
Date_affectation
Date_expiration
我应该使用哪种关联规则?
答案 0 :(得分:1)
您可以将关联建模为单独的Association
实体。时态数据可以建模为常规Date
属性(如@Temporal(TemporalType.TIMESTAMP)
)。
您可以将关联的PK建模为Entity_1
和Entity_2
的外键的组合 - 这将使关联成为依赖实体。或者您可以为其指定一个自己的ID,并通过ManyToOne关系连接到Entity_1
和Entity_2
。
编辑:我的示例实现的大部分是从@ Vlad的答案中无耻地被盗,因为主要区别在于实体具有id且可查询而嵌入不是。
我已从“日期”列中删除了@Column(updatable=false)
,因为我不确定这是否是必需的并添加了@Temporal(TemporalType.TIMESTAMP)
,因为它是required by the JPA spec,从而提高了可移植性。
由于这是一个双向映射,我在反面(实体)使用mappedBy
而不是在拥有方(关联)上使用JoinColumn
。
@Entity
public class Association {
@Id
@GeneratedValue(...)
private Long id;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date affectation;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date expiration;
@ManyToOne(fetch=FetchType.LAZY)
private Entity1 entity1;
@ManyToOne(fetch=FetchType.LAZY)
private Entity2 entity2;
}
Entity1和Entity2看起来一样,只需替换数字。我不确定使用Set
界面的附加值,所以我用List
替换它,但也许我错过了一些东西。
public class Entity1 {
@OneToMany(mappedBy="entity1")
private List<Association> associations = new ArrayList<Association>();
...
}
答案 1 :(得分:0)
除非您想要通过其ID获取关联,否则您应该选择具有可定义这两个日期字段的Embeddable Association。
@Embeddable
public class Association {
@Column(updatable=false)
private Date affectation;
@Column(updatable=false)
private Date expiration;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ENTITY_1_ID")
private Entity1 entity1;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ENTITY_2_ID")
private Entity2 entity2;
}
public class Entity1 {
@CollectionOfElements
@JoinTable(
table=@Table(name="ASSOCIATION"),
joinColumns=@JoinColumn(name="ENTITY_1_ID")
)
private Set<Association> associations = new HashSet<Association>();
}
public class Entity2 {
@CollectionOfElements
@JoinTable(
table=@Table(name="ASSOCIATION"),
joinColumns=@JoinColumn(name="ENTITY_2_ID")
)
private Set<Association> associations = new HashSet<Association>();
}
之前曾解释过here。