2012-07-06 50 views
1

我面臨一個奇怪的問題,我無法找到解決方案。我試圖用MySQl數據庫中的Hibernate加載一組對象。兩種不同的對象在休眠加載

這些是我的Hibernate映射和代碼的簡化版本:

<class name="org.Foo.Class1" table="class_profile" > 
    <cache usage="read-write"/> 
      <id name="id" column="id"> 
       <generator class="native"/> 
      </id> 
     <property name="amount" column="amount"/> 
</class> 
<class name="org.Foo.Class2" table="class_profile" > 
    <cache usage="read-write"/> 
      <id name="id" column="id"> 
       <generator class="native"/> 
      </id> 
     <property name="amount" column="amount"/> 
</class> 

這是我的代碼訪問,對象:

public List<Class1> loadProfiles(final List<Integer> pIds) 
{ 
    return (List<Class1>)getHibernateTemplate().executeFind(new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException { 
    return session.createQuery("from Class1 il where il.id in (:idList)") 
     .setParameterList("idList", pIds) 
     .list(); 
    } 
    }); 
} 

現在,當我跑我的代碼

List<Class1> profiles = fooService.loadProfiles(Arrays.asList(3,4)); 

我收到四個對象(而不是2)在列表配置文件中 - 兩個Class1對象和兩個Class2對象。兩個Class2對象來自哪裏?

+1

它們都映射到同一張表嗎? Class2是Class1的子類嗎?當你有實體繼承時,ID字段在所有子類中都必須是唯一的。 – Affe 2012-07-06 05:03:04

+0

是的,它們都映射到同一張表。是的,Class2派生自Class1(Java)。有了唯一的Id字段,你的意思是我應該在java中爲ID字段使用不同的名稱? [編輯]我會自己試試:) – 2012-07-06 05:19:30

+0

它應該只在java中定義一次,在Class1上。數據庫中的列必須是唯一的。不能有一行是Class1和一行是具有相同ID的Class2,或者您看到的查詢行爲是「正確的」。 – Affe 2012-07-06 05:31:39

回答

0

當你在兩個實體之間有繼承時,Hibernate需要能夠判斷某個特定的數據庫行應該代表哪個類。您可以通過在表中添加一個鑑別器類來告知它要構建哪個類來表示該行。

需要使用嵌套在Class1中的<subclass/>元素聲明Class2,該元素指定用什麼列來區分它們的值。

Detials here:http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/inheritance.html#inheritance-tableperclass

+0

有道理。我不認爲在這種情況下我需要繼承。單獨的課程。 – 2012-07-06 05:50:25