Hibernate中的会话管理(全局临时表)

时间:2014-08-11 12:55:40

标签: java spring oracle hibernate

我有两张桌子:SaveBatchLocalQueue。另外,我有一个程序SaveLocalSaveLocal会从SaveBatchLocalQueue删除行。但我必须说,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();          

    }

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

2 个答案:

答案 0 :(得分:0)

以下代码可以帮助您

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();          

}

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

希望它有所帮助。

答案 1 :(得分:0)

正如@ 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()

之前刷新我的会话