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()时是否使用了事务?您必须这样做。看看我的代码,它使用事务提交到数据库。若您不提交更改,那个么您的过程将并没有数据来填充队列。