Подтвердить что ты не робот

Спящий режим: объекты сохраняются без транзакции Object

У меня есть следующий фрагмент кода для сохранения объекта в базе данных,

import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.Session;
import org.hibernate.Transaction;
import model.Hibernatetest;
public class Test 
{
   static EntityManagerFactory objEntityManagerFactory;
   static Session objSession;
   static Transaction objTransaction;
   public static void main(String[] args) 
   {
        objSession = (Session) 
        objEntityManagerFactory.createEntityManager().getDelegate();
        //objTransaction = objSession.getTransaction();
        //objTransaction.begin();
        Hibernatetest obj = new Hibernatetest();
        obj.setName("Nobal");
        obj.setAddress("wlfjegtjwdfhdg");
        objSession.save(obj);
        obj.setName("235611111");
        objSession.flush();
       //objTransaction.commit();
        objSession.close();
    }

    public static void getConnection()
    {
        Map<String,String> properties = new HashMap<String,String>();
            properties.put("hibernate.connection.username", "root");
            properties.put("hibernate.connection.password", "root");
            properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
            properties.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernatetest");
            properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");

         objEntityManagerFactory = Persistence.createEntityManagerFactory("Hibereg", properties);
    }
}

а файл Persistence:

<persistence xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="Hibereg">
<class>entities.Hibernatetest</class>
</persistence-unit>
</persistence>

Случай 1:

Проблема заключается в том, что я запускаю вышеуказанный код с помощью hibernate-core-5.2.8.jar и не создаю никакого объекта транзакции (вы можете видеть, что я прокомментировал код, связанный с транзакцией), то приведенный выше код дает мне следующее исключение.

'TransactionRequiredException' no transaction is in progress.'

Однако, если я раскомментирую код транзакции, все работает хорошо.

Случай 2:

Но когда я запускаю код с помощью hibernate-core-4.1.4.jar, комментируя код транзакции в фрагменте кода, приведенном выше, он не дает такого исключения. То есть, он никогда не жалуется на отсутствие объекта транзакции и сохраняет объект в базе данных. Что здесь происходит?

Я прочитал через Интернет, что объект транзакции должен для выполнения вставок и обновлений (я не уверен в выборе), но как второй сценарий успешно выполняется?

4b9b3361

Ответ 1

Начиная с Hibernate 5.2, эта функциональность включена в стандартную спецификацию JPA, которая не позволяет сбросить обновление за пределами границы транзакции. Чтобы переопределить его, используйте следующие настройки в спящем режиме: -

properties.put("hibernate.allow_update_outside_transaction", "true");