我正在进行测验管理。所有映射都是通过Hibernate注释来完成的。问题是一个实体,而所有选项都是嵌入对象,因此我将选项映射如下:
QuestionMasterDTO对TabkidsMCQOptionMasterDTO
的映射:
@ElementCollection(fetch=FetchType.EAGER,targetClass=TabkidsMCQOptionMasterDTO.class)
@Fetch(FetchMode.SUBSELECT)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@CollectionTable(name="TABKIDS_MCQ_OPTION_MASTER",joinColumns={@JoinColumn(name="TMOM_QUESTION_ID")})
@GenericGenerator(name="hilo-gen",strategy="hilo")
@CollectionId(columns={@Column(name="TMOM_ID")},generator="hilo-gen", type=@Type(type="long"))
public Collection<IOptionMaster> getOptions() {
return options;
}
TabkidsMCQOptionMasterDTO在哪里:
@Embeddable
public class TabkidsMCQOptionMasterDTO implements IOptionMaster {
private String optionText;
private boolean correct;
@Column(name = "TMOM_OPTION_TEXT")
public String getOptionText() {
return optionText;
}
@Column(name = "TMOM_IS_CORRECT")
public boolean isCorrect() {
return correct;
}
//setters omitted
}
现在,在上面的映射中,您可以看到我正在使用生成器,即hilo-gen
,并为集合中可用的每个选项分配唯一ID,该列名称为“TMOM_ID
”。
这一行:
@GenericGenerator(name="hilo-gen",strategy="hilo")
@CollectionId(columns={@Column(name="TMOM_ID")},generator="hilo-gen", type=@Type(type="long"))
现在,当我使用Hibernate标准从数据库中提取问题时,我得到了与问题相关的所有选项,但未获得唯一选项ID,即TMOM_ID
。怎么得到这个id?
答案 0 :(得分:1)
Hibernate主要使用两种类型的映射Entity Type
和Value Type
。
实体类型意味着它将在世界中拥有自己的存在,即它必须具有主键。
虽然值类型没有自己的存在,但这意味着值类型始终依赖于实体类型。
作为你的问题,我可以看到Option没有它的存在,因为它必须始终依赖于作为实体的Question。
因此,从我的观点来看,如果您想要访问选项ID,则选项也必须是实体类型,这意味着您必须在TabkidsMCQOptionMasterDTO
之上使用@Entity,而不是将其设为@Embeddable
。
因此,您必须在问题母版中使用@OneToMany
,并在TabkidsMCQOptionMasterDTO
中的其他方面使用@ManyToOne
映射。
我希望这有助于实现您想要的目标。