[英]Session management in Hibernate (global temporary tables)
我有2個表: SaveBatchLocal
和Queue
。 另外,我有一個程序SaveLocal
。 SaveLocal
去除行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();
}
如果我將表更改為非臨時表,則效果很好。
以下代碼可以幫助您
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();
}
您需要做的就是將更改提交到數據庫的事務。
希望能幫助到你。
正如@ 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()
之前沖洗會話
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.