我面临一个奇怪的问题,我无法找到解决方案。我试图用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对象来自哪里?
它们都映射到同一张表吗? Class2是Class1的子类吗?当你有实体继承时,ID字段在所有子类中都必须是唯一的。 – Affe 2012-07-06 05:03:04
是的,它们都映射到同一张表。是的,Class2派生自Class1(Java)。有了唯一的Id字段,你的意思是我应该在java中为ID字段使用不同的名称? [编辑]我会自己试试:) – 2012-07-06 05:19:30
它应该只在java中定义一次,在Class1上。数据库中的列必须是唯一的。不能有一行是Class1和一行是具有相同ID的Class2,或者您看到的查询行为是“正确的”。 – Affe 2012-07-06 05:31:39