2015-04-16 71 views
0

我正在從事測驗管理工作。所有的映射都是通過Hibernate的註釋來完成的。問題是,而所有選項的實體被嵌入的對象,所以我映射選項,如下所示:如何在使用@collectionId映射集合時獲取由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", [email protected](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併爲收集中可用的每個選項分配一個唯一標識,並且該列名稱爲'TMOM_ID'。

這條線:

@GenericGenerator(name="hilo-gen",strategy="hilo") 
@CollectionId(columns={@Column(name="TMOM_ID")},generator="hilo-gen", [email protected](type="long")) 

現在,當我使用Hibernate的標準,我正在與問題有關的所有選項,但沒有得到唯一的選擇ID即TMOM_ID獲取從數據庫的問題。如何獲得這個ID?

+0

如果你想要任何額外的信息PLZ評論。 – Rajeev

回答

1

Hibernate主要使用兩種映射Entity TypeValue Type

實體類型意味着它將在世界上有它自己的存在,即它必須有一個主鍵。

鑑於值類型沒有自己的存在,這意味着值類型總是依賴於實體類型。

由於你的問題,我可以看到選項沒有它的存在,因爲它必須始終依賴於問題,這是一個實體。

因此,從我的角度來看,如果您想要訪問Option ID,Option也必須是實體類型,這意味着您必須在TabkidsMCQOptionMasterDTO之上使用@Entity,而不是將其設置爲@Embeddable

所以在這裏你必須使用@OneToMany在你的問題主和從其他方在TabkidsMCQOptionMasterDTO你必須使用@ManyToOne映射。

我希望這將有助於實現你想得到的。

+0

謝謝。我已經通過這個。我沒有別的選擇。 – Rajeev