首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Hibernate只查询默认映射?

如何使Hibernate只查询默认映射?
EN

Stack Overflow用户
提问于 2009-07-27 15:30:10
回答 4查看 4.3K关注 0票数 2

我有一个实体类:

Cabbage.java

代码语言:javascript
复制
package womble;

public class Cabbage {
    private int id;
    // getters, setters, etc.
}

我已经映射到两个独立的数据库表,如下所示:

Cabbage.hbm.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
<hibernate-mapping>
  <class name="womble.Cabbage" entity-name="CabbageBackup" table="cabbage_backup">
    <id name="id">
      <generator class="assigned"/>
    </id>
  </class>
</hibernate-mapping>

我正在尝试检索最后一个保存的卷心菜实例,如下所示:

CabbageDao.java

代码语言:javascript
复制
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“映射中指定实体名称,因为在我的代码中有多个这样的类,而且我还必须修复它们之间的所有关系。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-27 15:32:37

尝试在两个映射上使用entity-name,并指定您想要的映射。我相信这就是那个属性的契约。

票数 1
EN

Stack Overflow用户

发布于 2009-07-27 15:36:32

首先,Hibernate在这里没有“默认”的概念--就它而言,这两个映射是平等的。

您是否需要访问备份表中的旧卷心菜(这不是我以前使用过的短语),或者您只是使用该表来归档旧数据?

如果是后者,那么可能有更好的方法来实现相同的结果,例如使用数据库触发器。

票数 2
EN

Stack Overflow用户

发布于 2009-07-27 15:36:19

好吧,一个简单的答案(不一定是最好的答案)是使用.list()而不是.uniqueResult()来返回最大ids的集合。然后,您可以将结果放入一个新的HashSet中,并让Java完成唯一它们的工作。不是很优雅,但也能行得通。

代码语言:javascript
复制
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());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1188858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档