Почему спящий режим сохраняет значения без транзакции?

#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) значения (?, ?, ?, ?, ?, ?)

у меня есть несколько вопросов по этому поведению.

  1. Я знаю, что операция записи не произойдет без фиксации, так что есть идеи, что здесь не так или что вызывает фиксацию в первом сценарии?
  2. Можно ли использовать приведенный выше код, т.Е. Первый сценарий?
  3. Если первый подход неверен, нужно ли мне создавать и фиксировать txn для каждого объекта, какой-нибудь лучший подход, чтобы, даже если мне нужно зафиксировать txn, я не хотел реплицировать txn.commit() в каждом новом методе, который я пишу BaseDao.java т.е. скажем, у меня есть create(),методы update(), delete() могу ли я переместить этот txn.commit() из методов?
  4. В нескольких местах я использую spring data jpa для извлечения / сохранения записи (приведено ниже), как обрабатывается txn в spring data jpa? какие-либо ссылки?

    @Repository публичный интерфейс TestEntitytRepo расширяет JpaRepository<TestEntity, Long> { … }

Пожалуйста, дайте мне знать, если я пропустил какие-либо детали, которые можно здесь зафиксировать.

Заранее спасибо.

Ответ №1:

В спящем режиме метод Save() сохраняет объект в базе данных. Он сохранит данный переходный экземпляр, сначала присвоив сгенерированный идентификатор. Он возвращает идентификатор созданного объекта. Когда сеанс в гибернации создается с помощью SessionFactory.OpenSession(), транзакция не создается, поэтому все операции выполняются вне контекста транзакции !! Для обеспечения сохранения данных в базе данных необходимо создать новую транзакцию.

Я немного скептически отношусь к поведению, объясненному вами выше. Похоже, опция автоматической фиксации включена. Если это так, то это не проблема, поскольку метод save () выполнен, фиксация автоматически происходит за кулисами!!