Hibernate:在select调用上执行更新

时间:2014-04-09 09:39:53

标签: java hibernate

我遇到了休眠问题,我在通话时遇到了约束违规异常,我只想打电话给'选择'。

return getHibernateTemplate().execute(new HibernateCallback<List<HibernateObject>>() {
    @Override
    public List<HibernateObject> doInHibernate(Session session) {
        Criteria criteria = session
          .createCriteria(HibernateObject.class)
          .add(eq("myobject.id", id));

        return criteria.list();
    }
});

同样针对相关对象,更新调用不是HibernateObject。 如何在没有明确调用的情况下找出更新发生的原因?

2 个答案:

答案 0 :(得分:2)

默认情况下,hibernate使用FlushMode.AUTO,这意味着:

  

在查询执行之前,有时会刷新会话,以确保查询永远不会返回失效状态。

具有脏状态的实体必须附加到您的会话中,Hibernate会在执行查询之前将其保留。

答案 1 :(得分:1)

您可以使用StatelessSessionclear会话来将实体分离到持久性上下文。

  
      
  • 清除:彻底清除会话。退出所有已加载的实例并取消所有挂起的保存,更新和删除。不要   关闭打开的迭代器或ScrollableResults的实例。

  •   
  • StatelessSession :无状态会话不实现第一级缓存,也不与任何二级缓存交互,也不会   它实现事务性后写或自动脏检查,   操作也不会级联到关联的实例。收藏品是   无国籍会话忽略了。通过无国籍人员执行的操作   会话绕过Hibernate的事件模型和拦截器。无状态   由于缺少a,会话容易受到数据别名效应的影响   第一级缓存。

         

    对于某些类型的事务,可以执行无状态会话   比有状态会话稍快。

  •