#spring-boot #hibernate #spring-data-jpa #spring-data #hibernate-session
#весенняя загрузка #спящий режим #spring-data-jpa #весна-данные #спящий режим-сессия
Вопрос:
я использую spring boot (2.1.4) с гибернацией (5.3.9).
public class BaseDao{
@Autowired
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Autowired
private EntityManagerFactory entityManagerFactory;
@PersistenceContext
private EntityManager entityManager;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
public EntityManager getEntityManager() {
return entityManager;
}
public Session getSession() throws Exception{
if(session == null) {
session = getSessionFactory().openSession();
}
if(transaction == null) {
transaction = session.beginTransaction();
}
return session;
}
public void commit() throws Exception{
if(transaction != null) {
transaction.commit();
transaction = null;
}
if(session != null) {
session.close();
session = null;
}
}
public void rollback() throws Exception{
if(transaction != null) {
transaction.rollback();
transaction = null;
}
if(session != null) {
session.close();
session = null;
}
}
protected void save(Object object) throws Exception {
getSessionFactory().openSession().save(object); //saves data in db
getSession().save(object); //is not saving data
}
getSessionFactory().OpenSession().save(объект); этот код сохраняет данные в БД даже без фиксации
getSession().save(объект); этот код требует, чтобы фиксация вызывалась как txn создается, но не фиксируется
журнал гибернации
я вижу ниже журнал для обеих строк кода
вставить в TEST_ENTITY (CREATED_BY, CREATED_DATE, ENABLED, LAST_MODIFIED_BY, LAST_MODIFIED_DATE, NAME) значения (?, ?, ?, ?, ?, ?)
у меня есть несколько вопросов по этому поведению.
- Я знаю, что операция записи не произойдет без фиксации, так что есть идеи, что здесь не так или что вызывает фиксацию в первом сценарии?
- Можно ли использовать приведенный выше код, т.Е. Первый сценарий?
- Если первый подход неверен, нужно ли мне создавать и фиксировать txn для каждого объекта, какой-нибудь лучший подход, чтобы, даже если мне нужно зафиксировать txn, я не хотел реплицировать txn.commit() в каждом новом методе, который я пишу BaseDao.java т.е. скажем, у меня есть create(),методы update(), delete() могу ли я переместить этот txn.commit() из методов?
- В нескольких местах я использую spring data jpa для извлечения / сохранения записи (приведено ниже), как обрабатывается txn в spring data jpa? какие-либо ссылки?
@Repository публичный интерфейс TestEntitytRepo расширяет JpaRepository<TestEntity, Long> { … }
Пожалуйста, дайте мне знать, если я пропустил какие-либо детали, которые можно здесь зафиксировать.
Заранее спасибо.
Ответ №1:
В спящем режиме метод Save() сохраняет объект в базе данных. Он сохранит данный переходный экземпляр, сначала присвоив сгенерированный идентификатор. Он возвращает идентификатор созданного объекта. Когда сеанс в гибернации создается с помощью SessionFactory.OpenSession(), транзакция не создается, поэтому все операции выполняются вне контекста транзакции !! Для обеспечения сохранения данных в базе данных необходимо создать новую транзакцию.
Я немного скептически отношусь к поведению, объясненному вами выше. Похоже, опция автоматической фиксации включена. Если это так, то это не проблема, поскольку метод save () выполнен, фиксация автоматически происходит за кулисами!!