В соответствии с Hibernate documentation небезопасно использовать сеанс после того, как исключение вызывается Hibernate.Использование текущего Sesssion после исключения выбрано
Если сеанс вызывает исключение, включая любое SQLException, немедленно откат транзакции базы данных, вызовите Session.close() и отмените экземпляр сеанса. Некоторые методы сеанса не оставляют сеанс в согласованном состоянии. Никакое исключение, вызванное Hibernate, не может рассматриваться как подлежащее восстановлению. Убедитесь, что сессия будет закрыта вызовом функции close() в блоке finally.
В моем коде я делаю пакетную вставку. Я использую метод sessionFactory.getCurrentSession()
для получения сеанса. Мой код такой.
try {
//some code here....
....
Table1Entity table1Entity = .......
List<Table2Entity> table2Entities = .......
Session currentSession = sessionFactory.getCurrentSession();
for (int i = 0; i < table2Entities; i++) {
.............
currentSession.save(table2Entities.get(i));
if(i % batchSize == 0 || i + 1 == table2Entities) {
currentSession.flush();
currentSession.clear();
}
}
} catch (Exception e) {
currentSession.getTransaction().rollback();
//currentSession.close(); //According to documentation Session should be closed here
table1Entity.setError(true);
currentSession.save(table1Entity);//According to documentation Session should not be used here
.......
}
Как указано в документации, сеанс не должен использоваться после исключения исключения. Моя проблема в том, что я использую currentSession
, как я могу сохранить table1Entity
в блоке catch? Должен ли я открыть новый сеанс с использованием метода openSession()
или любым другим способом?
Edit: Чтобы быть более ясным, просто то, что я спрашиваю, могу ли я получить новый currentSession после существующего currentSession закрыт.
делает это [это] (http://stackoverflow.com/questions/25738883/spring-transactional-annotation-when-using-try-catch-block/25739582#25739582) помогает вам где-то –
@ ankur-singhal Спасибо за связь. Но это не решает мою проблему. В этом ответе он откатывает всю транзакцию. В моем случае мне нужно сохранить другой объект после исключения. – prageeth