Tengo el siguiente código para guardar el objeto en la base de datos,
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); } }y el archivo de persistencia es el siguiente:
<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>El problema es cuando ejecuto el código anterior usando hibernate-core-5.2.8.jar , y no creo ningún objeto de transacción (puede ver que comenté el código relacionado con la transacción), entonces el código anterior me da la siguiente excepción.
'TransactionRequiredException' no transaction is in progress.'Sin embargo, si elimino el comentario del código de la transacción, todo funciona bien.
Pero cuando ejecuto el código usando hibernate-core-4.1.4.jar , al comentar el código de la transacción en el fragmento de código proporcionado anteriormente, no da tal excepción. Es decir, nunca se queja por la ausencia del objeto de transacción y guarda el objeto en la base de datos. ¿Qué está pasando aquí?
Leí en Internet que el objeto de transacción es imprescindible para realizar inserciones y actualizaciones (no estoy seguro de las selecciones), pero ¿cómo se ejecuta correctamente el segundo escenario?
Desde Hibernate 5.2, esta funcionalidad se incluye en línea con la especificación JPA que no permite ninguna actualización fuera de los límites de una transacción. Para anularlo, use lo siguiente en su configuración de hibernación: -
properties.put("hibernate.allow_update_outside_transaction", "true");