Revert "HHH-12391 - attempt to create test reproducing error; no luck"
This reverts commit 6e82e4fd53
.
This commit is contained in:
parent
6e82e4fd53
commit
7a47be8d9b
|
@ -6,30 +6,18 @@
|
|||
*/
|
||||
package org.hibernate.test.resource.transaction.jdbc.autocommit;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.Id;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.engine.transaction.spi.TransactionImplementor;
|
||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||
|
||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||
import org.hibernate.testing.transaction.TransactionUtil2;
|
||||
import org.hibernate.test.util.jdbc.PreparedStatementSpyConnectionProvider;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||
|
@ -42,17 +30,10 @@ import static org.mockito.Mockito.verify;
|
|||
/**
|
||||
* @author Vlad Mihalcea
|
||||
*/
|
||||
public abstract class AbstractSkipAutoCommitTest extends BaseUnitTestCase {
|
||||
public abstract class AbstractSkipAutoCommitTest extends BaseEntityManagerFunctionalTestCase {
|
||||
|
||||
private PreparedStatementSpyConnectionProvider connectionProvider;
|
||||
private DataSource dataSource;
|
||||
private SessionFactoryImplementor emf;
|
||||
|
||||
@Before
|
||||
public void createEntityManagerFactory() {
|
||||
Map<String,Object> config = new HashMap<>();
|
||||
|
||||
connectionProvider = new PreparedStatementSpyConnectionProvider() {
|
||||
private PreparedStatementSpyConnectionProvider connectionProvider =
|
||||
new PreparedStatementSpyConnectionProvider() {
|
||||
@Override
|
||||
protected Connection actualConnection() throws SQLException {
|
||||
Connection connection = super.actualConnection();
|
||||
|
@ -61,93 +42,51 @@ public abstract class AbstractSkipAutoCommitTest extends BaseUnitTestCase {
|
|||
}
|
||||
};
|
||||
|
||||
dataSource = dataSource();
|
||||
@Override
|
||||
protected Map getConfig() {
|
||||
Map config = super.getConfig();
|
||||
|
||||
config.put( AvailableSettings.CONNECTION_PROVIDER, connectionProvider );
|
||||
config.put( AvailableSettings.DATASOURCE, dataSource );
|
||||
config.put( AvailableSettings.DATASOURCE, dataSource() );
|
||||
config.put( AvailableSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, Boolean.TRUE );
|
||||
config.put( AvailableSettings.HBM2DDL_AUTO, "create-drop" );
|
||||
config.put( AvailableSettings.CONNECTION_PROVIDER, connectionProvider );
|
||||
|
||||
config.put( AvailableSettings.JPA_TRANSACTION_COMPLIANCE, "false" );
|
||||
|
||||
emf = Bootstrap.getEntityManagerFactoryBuilder(
|
||||
new BaseEntityManagerFunctionalTestCase.TestingPersistenceUnitDescriptorImpl( getClass().getSimpleName() ) {
|
||||
@Override
|
||||
public List<String> getManagedClassNames() {
|
||||
return Collections.singletonList( City.class.getName() );
|
||||
}
|
||||
},
|
||||
config
|
||||
).build().unwrap( SessionFactoryImplementor.class );
|
||||
if ( emf == null ) {
|
||||
throw new RuntimeException( "Could not build EMF" );
|
||||
}
|
||||
return config;
|
||||
}
|
||||
|
||||
protected abstract DataSource dataSource();
|
||||
|
||||
@After
|
||||
@Override
|
||||
public void releaseResources() {
|
||||
if ( connectionProvider != null ) {
|
||||
connectionProvider.stop();
|
||||
}
|
||||
|
||||
// todo : somewhay to stop/close DataSource if not Closeable?
|
||||
if ( dataSource instanceof Closeable ) {
|
||||
try {
|
||||
( (Closeable) dataSource ).close();
|
||||
}
|
||||
catch (IOException e) {
|
||||
log.debugf( "Unable to release DataSource : %s", dataSource );
|
||||
}
|
||||
|
||||
if ( emf != null ) {
|
||||
emf.close();
|
||||
}
|
||||
}
|
||||
super.releaseResources();
|
||||
connectionProvider.stop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackOnNonJtaDataSourceWithAutoCommitConnection() {
|
||||
TransactionUtil2.inEntityManager(
|
||||
emf,
|
||||
entityManager -> {
|
||||
final EntityTransaction txn = entityManager.getTransaction();
|
||||
// txn.begin();
|
||||
|
||||
final TransactionImplementor hibernateTxn = (TransactionImplementor) txn;
|
||||
hibernateTxn.markRollbackOnly();
|
||||
|
||||
txn.rollback();
|
||||
}
|
||||
);
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] {
|
||||
City.class,
|
||||
};
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
connectionProvider.clear();
|
||||
doInJPA(
|
||||
() -> emf,
|
||||
entityManager -> {
|
||||
City city = new City();
|
||||
city.setId( 1L );
|
||||
city.setName( "Cluj-Napoca" );
|
||||
entityManager.persist( city );
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
City city = new City();
|
||||
city.setId( 1L );
|
||||
city.setName( "Cluj-Napoca" );
|
||||
entityManager.persist( city );
|
||||
|
||||
assertTrue( connectionProvider.getAcquiredConnections().isEmpty() );
|
||||
assertTrue( connectionProvider.getReleasedConnections().isEmpty() );
|
||||
}
|
||||
);
|
||||
assertTrue( connectionProvider.getAcquiredConnections().isEmpty() );
|
||||
assertTrue( connectionProvider.getReleasedConnections().isEmpty() );
|
||||
} );
|
||||
verifyConnections();
|
||||
|
||||
connectionProvider.clear();
|
||||
doInJPA(
|
||||
() -> emf,
|
||||
entityManager -> {
|
||||
City city = entityManager.find( City.class, 1L );
|
||||
assertEquals( "Cluj-Napoca", city.getName() );
|
||||
}
|
||||
);
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
City city = entityManager.find( City.class, 1L );
|
||||
assertEquals( "Cluj-Napoca", city.getName() );
|
||||
} );
|
||||
verifyConnections();
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ import javax.sql.DataSource;
|
|||
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.dialect.Dialect;
|
||||
import org.hibernate.dialect.MariaDBDialect;
|
||||
import org.hibernate.dialect.MySQLDialect;
|
||||
|
||||
|
@ -27,7 +26,7 @@ public class MySQLSkipAutoCommitTest extends AbstractSkipAutoCommitTest {
|
|||
@Override
|
||||
protected DataSource dataSource() {
|
||||
DataSource dataSource = ReflectionUtil.newInstance( "com.mysql.cj.jdbc.MysqlDataSource" );
|
||||
if ( Dialect.getDialect() instanceof MariaDBDialect ) {
|
||||
if ( getDialect() instanceof MariaDBDialect ) {
|
||||
dataSource = ReflectionUtil.newInstance( "org.mariadb.jdbc.MariaDbDataSource" );
|
||||
}
|
||||
ReflectionUtil.setProperty( dataSource, "url", Environment.getProperties().getProperty( AvailableSettings.URL ) );
|
||||
|
|
|
@ -7,9 +7,6 @@
|
|||
package org.hibernate.testing.transaction;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.persistence.EntityTransaction;
|
||||
|
||||
import org.hibernate.Transaction;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
|
@ -37,18 +34,6 @@ public class TransactionUtil2 {
|
|||
}
|
||||
}
|
||||
|
||||
public static void inEntityManager(EntityManagerFactory emf, Consumer<EntityManager> action) {
|
||||
log.trace( "#inEntityManager(EMF,action)" );
|
||||
|
||||
try (SessionImplementor session = (SessionImplementor) emf.createEntityManager()) {
|
||||
log.trace( "EntityManager opened, calling action" );
|
||||
action.accept( session );
|
||||
log.trace( "called action" );
|
||||
}
|
||||
finally {
|
||||
log.trace( "EntityManager closed (AutoCloseable)" );
|
||||
}
|
||||
}
|
||||
|
||||
public static void inTransaction(SessionFactoryImplementor factory, Consumer<SessionImplementor> action) {
|
||||
log.trace( "#inTransaction(factory, action)");
|
||||
|
@ -61,67 +46,6 @@ public class TransactionUtil2 {
|
|||
);
|
||||
}
|
||||
|
||||
public static void inEntityTransaction(EntityManagerFactory factory, Consumer<EntityManager> action) {
|
||||
log.trace( "#inEntityTransaction(factory, action)");
|
||||
|
||||
inEntityManager(
|
||||
factory,
|
||||
session -> {
|
||||
inEntityTransaction( session, action );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public static void inEntityTransaction(EntityManager entityManager, Consumer<EntityManager> action) {
|
||||
log.trace( "#inTransaction(factory, action)");
|
||||
|
||||
final EntityTransaction txn = entityManager.getTransaction();
|
||||
txn.begin();
|
||||
log.trace( "Started transaction" );
|
||||
|
||||
try {
|
||||
log.trace( "Calling action in txn" );
|
||||
action.accept( entityManager );
|
||||
log.trace( "Called action - in txn" );
|
||||
|
||||
if ( !txn.isActive() ) {
|
||||
throw new TransactionManagementException( ACTION_COMPLETED_TXN );
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// an error happened in the action
|
||||
if ( ! txn.isActive() ) {
|
||||
log.warn( ACTION_COMPLETED_TXN, e );
|
||||
}
|
||||
else {
|
||||
log.trace( "Rolling back transaction due to action error" );
|
||||
try {
|
||||
txn.rollback();
|
||||
log.trace( "Rolled back transaction due to action error" );
|
||||
}
|
||||
catch (Exception inner) {
|
||||
log.trace( "Rolling back transaction due to action error failed; throwing original error" );
|
||||
}
|
||||
}
|
||||
|
||||
throw e;
|
||||
}
|
||||
|
||||
// action completed with no errors - attempt to commit the transaction allowing
|
||||
// any RollbackException to propagate. Note that when we get here we know the
|
||||
// txn is active
|
||||
|
||||
log.trace( "Committing transaction after successful action execution" );
|
||||
try {
|
||||
txn.commit();
|
||||
log.trace( "Committing transaction after successful action execution - success" );
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.trace( "Committing transaction after successful action execution - failure" );
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public static void inTransaction(SessionImplementor session, Consumer<SessionImplementor> action) {
|
||||
log.trace( "inTransaction(session,action)" );
|
||||
|
||||
|
|
Loading…
Reference in New Issue