代码之家  ›  专栏  ›  技术社区  ›  millimoose Tomasz Nurkiewicz

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

  •  2
  • millimoose Tomasz Nurkiewicz  · 技术社区  · 17 年前

    我有一个实体类:

    卷心菜

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

    coball.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>
    

    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只查询实体的默认映射?(也就是说,当我使用简单的类名时,要特别防止它神奇地查询这两个映射。)

    4 回复  |  直到 17 年前
        1
  •  2
  •   skaffman    17 年前

    首先,Hibernate在这里不知道您的“默认值”——就其而言,这两个映射是平等的。

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

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

        2
  •  1
  •   Edward Q. Bridges    17 年前

    尝试在两个映射上使用实体名称,并指定所需的名称。我认为,这是该属性的契约。

        3
  •  0
  •   dustmachine    17 年前

    .list() .uniqueResult() 正在带回最大ID的集合。然后,您可以将结果放入一个新的 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());
    }
    
        4
  •  0
  •   Petriborg    17 年前

    你可以考虑其中之一 extensions to hibernate 这张表为您做了哪些修订。我从未亲自使用过envers,但文档看起来很有趣。