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

Java Hibernate中的会话管理(全局临时表),java,spring,oracle,hibernate,Java,Spring,Oracle,Hibernate,我有两个表:SaveBatchLocal和Queue。另外,我还有一个过程SaveLocalSaveLocal将行从SaveBatchLocal删除到队列。但我必须说,SaveBatchLocal是全局临时表 如果我在SaveBatchLocal中添加新行,然后使用Oracle SQL Developer调用Save,则行会正确显示在队列中,但不会出现在我的Spring应用程序中。据我所知,临时数据在一个会话上下文中是可见的。那么,我必须如何修改我的代码?sessionFactory是否每次都创

我有两个表:
SaveBatchLocal
Queue
。另外,我还有一个过程
SaveLocal
SaveLocal
将行从
SaveBatchLocal
删除到
队列
。但我必须说,
SaveBatchLocal
是全局临时表

如果我在
SaveBatchLocal
中添加新行,然后使用Oracle SQL Developer调用
Save
,则行会正确显示在
队列中,但不会出现在我的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();          

    }
public void add(LinkedList-smsEntityList){
试试{
会话=空;
session=this.sessionFactory.getCurrentSession();
迭代器迭代器=smsEntityList.Iterator();
while(iterator.hasNext()){
save(iterator.next());
}
保存(会话);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效保存(会话){
Query Query=session.createSQLQuery(“{CALL DBManager.SaveLocal}”);
query.executeUpdate();
}

如果我将表更改为非临时表,它会正常工作。

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

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

}
public void add(LinkedList-smsEntityList){
试试{
会话=空;
事务tx=会话.beginTransaction();
session=this.sessionFactory.getCurrentSession();
迭代器迭代器=smsEntityList.Iterator();
while(iterator.hasNext()){
save(iterator.next());
tx.commit();
}
保存(会话);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效保存(会话){
Query Query=session.createSQLQuery(“{CALL DBManager.SaveLocal}”);
query.executeUpdate();
}
您所需要的只是将更改提交到数据库的事务

希望能有所帮助。

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

    }
public void add(LinkedList-smsEntityList){
试一试{
会话=空;
session=this.sessionFactory.getCurrentSession();
迭代器迭代器=smsEntityList.Iterator();
while(iterator.hasNext()){
save(iterator.next());
}
session.flush();
保存(会话);
}捕获(例外e){
e、 printStackTrace();
}
}

我应该在
save()

之前刷新会话队列是否也临时保留数据?当您使用sessionFactory.getCurrentSession()时,您获得的会话的作用域是线程,因此只要线程处于活动状态,您将获得相同的会话。在调用过程之前,请执行session.flush(),您的spring应用程序中是否使用@Transactional?@user3487063,非常感谢。顺便说一句,我必须每次刷新会话吗?在调用过程之前应该可以,比如session.flush();保存(会话);不,没用。另外,SaveLocal过程不会提交。调用session.save()时是否使用了事务?您必须这样做。看看我的代码,它使用事务提交到数据库。若您不提交更改,那个么您的过程将并没有数据来填充队列。