【问题标题】:Session management in Hibernate (global temporary tables)Hibernate 中的会话管理(全局临时表)
【发布时间】:2014-08-11 12:55:40
【问题描述】:

我有 2 张桌子:SaveBatchLocalQueue。另外,我有一个程序SaveLocalSaveLocal 将行从 SaveBatchLocal 删除到 Queue。但我必须说,SaveBatchLocal 是全局临时表。

如果我将新行添加到 SaveBatchLocal,然后使用 Oracle SQL Developer 调用 Save,行会正确显示在 Queue 中,但不会在我的 Spring 应用程序中出现。据我所知,临时数据在一个会话上下文中是可见的。那么,我该如何修改我的代码呢? sessionFactory 是否每次都创建新会话?

这是我的代码:

    public void add(LinkedList<SmsEntity> smsEntityList) {
            try {           
                Session session = null;
                session = this.sessionFactory.getCurrentSession();
                Iterator<SmsEntity> iterator = smsEntityList.iterator();            
                while (iterator.hasNext()) {
                    session.save(iterator.next());
                }
                save(session);          
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

   public void save(Session session) {      
        Query query = session.createSQLQuery("{CALL DBManager.SaveLocal}");
        query.executeUpdate();          

    }

如果我将表更改为非临时表,则效果很好。

【问题讨论】:

  • 队列是否也临时保存数据?
  • 当您使用 sessionFactory.getCurrentSession() 时,您获得的会话的范围是线程,因此只要线程处于活动状态,您就会获得相同的会话。
  • 在调用过程之前做一个 session.flush(),你也在你的 spring 应用程序中使用@Transactional 吗?
  • @user3487063,非常感谢。顺便说一句,我每次都必须刷新会话吗?
  • 在调用过程之前应该没问题,比如 session.flush();保存(会话);

标签: java spring oracle hibernate


【解决方案1】:

下面的代码应该可以帮助你

public void add(LinkedList<SmsEntity> smsEntityList) {
        try {           
            Session session = null;
            Transaction tx=session.beginTransaction();
            session = this.sessionFactory.getCurrentSession();
            Iterator<SmsEntity> iterator = smsEntityList.iterator();            
            while (iterator.hasNext()) {
                session.save(iterator.next());
                tx.commit();
            }
            save(session);          
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

 public void save(Session session) {      
    Query query = session.createSQLQuery("{CALL DBManager.SaveLocal}");
    query.executeUpdate();          

}

您只需要事务即可将更改提交到数据库。

希望对你有帮助。

【讨论】:

  • 不,没有帮助。此外,SaveLocal 过程确实提交。
  • 你在调用 session.save() 时是否使用了事务?
  • 你必须这样做。看看我的代码,它使用事务提交到数据库。如果您不提交更改,那么您的过程将没有数据填充队列。
【解决方案2】:

正如@user3487063 所说:

public void add(LinkedList<SmsEntity> smsEntityList) {
        try {

            Session session = null;         
            session = this.sessionFactory.getCurrentSession();      
            Iterator<SmsEntity> iterator = smsEntityList.iterator();            
            while (iterator.hasNext()) {            
                session.save(iterator.next());          
            }
            session.flush();
            save(session);          
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

我应该在save()之前刷新我的会话

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多