2012-07-06 48 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