我有一个实体类:
Cabbage.java
package womble;
public class Cabbage {
private int id;
// getters, setters, etc.
}我已经映射到两个独立的数据库表,如下所示:
Cabbage.hbm.xml
<hibernate-mapping>
<class name="womble.Cabbage"> <!-- Using the default entity and table name. -->
<id name="id" unsaved-value="null">
<generator class="native"/>
</id>
</class>
</hibernate-mapping>CabbageBackup.hbm.xml
<hibernate-mapping>
<class name="womble.Cabbage" entity-name="CabbageBackup" table="cabbage_backup">
<id name="id">
<generator class="assigned"/>
</id>
</class>
</hibernate-mapping>我正在尝试检索最后一个保存的卷心菜实例,如下所示:
CabbageDao.java
package womble;
public class CabbageDao {
Session session; // Hibernate session
String GET_MAX_ID = "select max(id) from Cabbage";
public getLastCabbage() {
Object lastId = session.createQuery(GET_MAX_ID).uniqueResult();
return session.load(Cabbage.class, lastId);
}
}这会导致一个查询:“NonUniqueResultException没有返回唯一的结果: 2”
通过查看日志,Hibernate显然查询了这两个表,然后将结果合并在一起。
有没有办法让Hibernate只查询实体的默认映射?(也就是说,当我使用简单的类名时,专门防止它神奇地查询两个映射。)
我试着使用上面的方法,使用criteria将Cabbage.class传递给#createCriteria(),以及字符串“菜”,这两个都是从两个表中选择的。我尽量避免在"main“映射中指定实体名称,因为在我的代码中有多个这样的类,而且我还必须修复它们之间的所有关系。
发布于 2009-07-27 15:32:37
尝试在两个映射上使用entity-name,并指定您想要的映射。我相信这就是那个属性的契约。
发布于 2009-07-27 15:36:32
首先,Hibernate在这里没有“默认”的概念--就它而言,这两个映射是平等的。
您是否需要访问备份表中的旧卷心菜(这不是我以前使用过的短语),或者您只是使用该表来归档旧数据?
如果是后者,那么可能有更好的方法来实现相同的结果,例如使用数据库触发器。
发布于 2009-07-27 15:36:19
好吧,一个简单的答案(不一定是最好的答案)是使用.list()而不是.uniqueResult()来返回最大ids的集合。然后,您可以将结果放入一个新的HashSet中,并让Java完成唯一它们的工作。不是很优雅,但也能行得通。
public getLastCabbage() {
Set lastIds = new HashSet(session.createQuery(GET_MAX_ID).list());
// ignore the possibility of null; full steam ahead
return session.load(Cabbage.class, lastIds.iterator().next());
}https://stackoverflow.com/questions/1188858
复制相似问题