使用@collectionId映射集合时如何获取Hibernate生成的密钥?

时间:2015-04-16 05:45:13

标签: java hibernate

我正在进行测验管理。所有映射都是通过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?

1 个答案:

答案 0 :(得分:1)

Hibernate主要使用两种类型的映射Entity TypeValue Type

实体类型意味着它将在世界中拥有自己的存在,即它必须具有主键。

虽然值类型没有自己的存在,但这意味着值类型始终依赖于实体类型。

作为你的问题,我可以看到Option没有它的存在,因为它必须始终依赖于作为实体的Question。

因此,从我的观点来看,如果您想要访问选项ID,则选项也必须是实体类型,这意味着您必须在TabkidsMCQOptionMasterDTO之上使用@Entity,而不是将其设为@Embeddable

因此,您必须在问题母版中使用@OneToMany,并在TabkidsMCQOptionMasterDTO中的其他方面使用@ManyToOne映射。

我希望这有助于实现您想要的目标。