Я думаю, что вы пытаетесь разделить один и тот же сеанс Hibernate в нескольких потоках. Это незаконно.
Сеансы Hibernate не являются поточно-ориентированными, тогда как Hibernate SessionFactory является поточно-ориентированным.
Итак, создайте отдельный слой DAO. Создайте отдельный объект сеанса и поделитесь им с классами DAO.
Получить сеанс для однопоточной операции с БД и закрыть сеанс в этом потоке.
Например:
@Repository
public class DAO {
@Autowired
private SessionFactory sessionFactory;
public class performDBOperation(Object obj) {
Session session = sessionFactory.currentSession();
session.save(obj);
session.close();
}
}
Теперь я посмотрел ваш github код.
Я видел код Exe c. java
@Service
public interface Exec {
@Async
@Transactional
public void run();
}
Это неверно.
Обновлено:
public interface Exec {
public void run();
}
Обновите ExecImpl до этого:
@Service
public class ExecImpl implements Exec {
@Autowired
private ExecDAO execDAO;
@Override
@Async
@Transactional
public void run() {
// example : create an object to save it.
Object object = ...;
execDAO.saveItem(object);
}
}
Создать слой DAO:
Предположим, ExecDAO
интерфейс и реализация ExecDAOImpl
:
public interface ExecDAO {
public void saveItem(Object obj);
// keep here abstract method to perform DB operation
}
@Repository
public class ExecDAOImpl implements ExecDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void saveItem(Object obj) {
Session session = sessionFactory.currentSession();
session.save(obj);
session.close();
}
}