2013-05-29 84 views
0

我有inheriatnce型SINGLE_TABLE實體層次:如何在Hibernate中將實體屬性映射到繼承SINGLE_TABLE的實體?

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorValue("junioruser") 
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING) 
......... 
public class JuniorUser { 

的問題是如何回答實體映射這個JuniorUser實體所有它的子類財產爲:

@Entity 
public class Answer { 
private JuniorUser user; 
.......................... 

如果是不可能那麼我怎麼能映射到'用戶'屬性在Answer實體正確的JuniorUser或JuniorUser的子類本身使用Hibernate 4?

UPDATE: 我這樣做是爲了獲取答案和相關的用戶:

Answer answer = sessionFactory.getCurrentSession().get(entityClass, id); 

詢問相關用戶的規範名稱

answer.getUser().getClass().getCanonicalName(); 

com.javahelp.domain.impl.JuniorUser_$$_javassist_3
接下來要求的屬性值它給出'低級用戶'的dtype。 最後一件事是該用戶的所有其他屬性都爲null,包括user_id屬性。
我自己看到,對於檢索答案,我有相關用戶,其中dtype爲'expertuser'

謝謝!

+1

與ManyToOne(假設用戶有幾個答案)。有什麼問題?爲什麼你認爲繼承會改變協會的映射方式? –

+0

我很抱歉!它真的檢索ExpertUser!問題是我爲用戶指定了FetchType.LAZY,並試圖通過反射來獲取用戶值。用戶屬性尚未由hibernate初始化! –

回答

0

這裏的主要問題是誤解提取類型。

FetchType.EAGER表示當在一個select中加載父項時,從數據庫加載相關的實體屬性。創建相關實體的新實例,並將從數據庫中提取的所有值分配給其屬性。相關實體本身也被分配給父實體的財產。

FetchType.LAZY表示從數據庫的這個相關實體的代理中加載父代並將代理指定給父實體屬性。爲了獲得延遲加載的相關實體的任何值,需要調用其代理的方法。

相關問題