Search in sources :

Example 71 with SessionImplementor

use of org.hibernate.engine.spi.SessionImplementor in project hibernate-orm by hibernate.

the class NonBatchingBatchFailureTest method testBasicInsertion.

@Test
public void testBasicInsertion() {
    Session session = openSession();
    session.getTransaction().begin();
    try {
        session.persist(new User(1, "ok"));
        session.persist(new User(2, null));
        session.persist(new User(3, "ok"));
        // the flush should fail
        session.flush();
        fail("Expecting failed flush");
    } catch (Exception expected) {
        System.out.println("Caught expected exception : " + expected);
        expected.printStackTrace(System.out);
        try {
            //at this point the transaction is still active but the batch should have been aborted (have to use reflection to get at the field)
            SessionImplementor sessionImplementor = (SessionImplementor) session;
            Field field = sessionImplementor.getJdbcCoordinator().getClass().getDeclaredField("currentBatch");
            field.setAccessible(true);
            Batch batch = (Batch) field.get(sessionImplementor.getJdbcCoordinator());
            if (batch == null) {
                throw new Exception("Current batch was null");
            } else {
                //make sure it's actually a batching impl
                assertEquals(NonBatchingBatch.class, batch.getClass());
                field = AbstractBatchImpl.class.getDeclaredField("statements");
                field.setAccessible(true);
                //check to see that there aren't any statements queued up (this can be an issue if using SavePoints)
                assertEquals(0, ((Map) field.get(batch)).size());
            }
        } catch (Exception fieldException) {
            fail("Couldn't inspect field " + fieldException.getMessage());
        }
    } finally {
        session.getTransaction().rollback();
        session.close();
    }
}
Also used : Field(java.lang.reflect.Field) NonBatchingBatch(org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch) Batch(org.hibernate.engine.jdbc.batch.spi.Batch) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) NonBatchingBatch(org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch) Map(java.util.Map) Session(org.hibernate.Session) Test(org.junit.Test)

Example 72 with SessionImplementor

use of org.hibernate.engine.spi.SessionImplementor in project hibernate-orm by hibernate.

the class SQLServerDialectTest method testMaxResultsSqlServerWithCaseSensitiveCollation.

@Test
@TestForIssue(jiraKey = "HHH-7198")
public void testMaxResultsSqlServerWithCaseSensitiveCollation() throws Exception {
    final Session s1 = openSession();
    s1.beginTransaction();
    String defaultCollationName = s1.doReturningWork(connection -> {
        String databaseName = connection.getCatalog();
        Statement st = ((SessionImplementor) s1).getJdbcCoordinator().getStatementPreparer().createStatement();
        ResultSet rs = ((SessionImplementor) s1).getJdbcCoordinator().getResultSetReturn().extract(st, "SELECT collation_name FROM sys.databases WHERE name = '" + databaseName + "';");
        while (rs.next()) {
            return rs.getString("collation_name");
        }
        throw new AssertionError("can't get collation name of database " + databaseName);
    });
    s1.getTransaction().commit();
    s1.close();
    Session s2 = openSession();
    Transaction tx = s2.beginTransaction();
    String databaseName = s2.doReturningWork(new ReturningWork<String>() {

        @Override
        public String execute(Connection connection) throws SQLException {
            return connection.getCatalog();
        }
    });
    s2.createNativeQuery("ALTER DATABASE " + databaseName + " set single_user with rollback immediate").executeUpdate();
    s2.createNativeQuery("ALTER DATABASE " + databaseName + " COLLATE Latin1_General_CS_AS").executeUpdate();
    s2.createNativeQuery("ALTER DATABASE " + databaseName + " set multi_user").executeUpdate();
    for (int i = 1; i <= 20; i++) {
        s2.persist(new Product2(i, "Kit" + i));
    }
    s2.flush();
    s2.clear();
    List list = s2.createQuery("from Product2 where description like 'Kit%'").setFirstResult(2).setMaxResults(2).list();
    assertEquals(2, list.size());
    tx.rollback();
    s2.close();
    executorService.execute(() -> {
        doInHibernate(this::sessionFactory, s3 -> {
            s3.createNativeQuery("ALTER DATABASE " + databaseName + " set single_user with rollback immediate").executeUpdate();
            s3.createNativeQuery("ALTER DATABASE " + databaseName + " COLLATE " + defaultCollationName).executeUpdate();
            s3.createNativeQuery("ALTER DATABASE " + databaseName + " set multi_user").executeUpdate();
        });
    });
}
Also used : SQLException(java.sql.SQLException) Statement(java.sql.Statement) Connection(java.sql.Connection) Transaction(org.hibernate.Transaction) ResultSet(java.sql.ResultSet) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) List(java.util.List) Session(org.hibernate.Session) Test(org.junit.Test) TestForIssue(org.hibernate.testing.TestForIssue)

Example 73 with SessionImplementor

use of org.hibernate.engine.spi.SessionImplementor in project hibernate-orm by hibernate.

the class BatchingTest method testNonBatchingUsage.

@Test
public void testNonBatchingUsage() throws Exception {
    Session session = openSession();
    SessionImplementor sessionImpl = (SessionImplementor) session;
    final JdbcCoordinator jdbcCoordinator = sessionImpl.getJdbcCoordinator();
    LogicalConnectionImplementor logicalConnection = jdbcCoordinator.getLogicalConnection();
    // set up some tables to use
    Statement statement = jdbcCoordinator.getStatementPreparer().createStatement();
    String dropSql = getDialect().getDropTableString("SANDBOX_JDBC_TST");
    try {
        jdbcCoordinator.getResultSetReturn().execute(statement, dropSql);
    } catch (Exception e) {
    // ignore if the DB doesn't support "if exists" and the table doesn't exist
    }
    jdbcCoordinator.getResultSetReturn().execute(statement, "create table SANDBOX_JDBC_TST ( ID integer, NAME varchar(100) )");
    assertTrue(jdbcCoordinator.getResourceRegistry().hasRegisteredResources());
    assertTrue(logicalConnection.isPhysicallyConnected());
    jdbcCoordinator.getResourceRegistry().release(statement);
    assertFalse(jdbcCoordinator.getResourceRegistry().hasRegisteredResources());
    // after_transaction specified
    assertTrue(logicalConnection.isPhysicallyConnected());
    // ok, now we can get down to it...
    // same as Session#getTransaction
    Transaction txn = session.getTransaction();
    txn.begin();
    final String insertSql = "insert into SANDBOX_JDBC_TST( ID, NAME ) values ( ?, ? )";
    final BatchBuilder batchBuilder = new BatchBuilderImpl(-1);
    final BatchKey batchKey = new BasicBatchKey("this", Expectations.BASIC);
    final Batch insertBatch = batchBuilder.buildBatch(batchKey, jdbcCoordinator);
    final JournalingBatchObserver batchObserver = new JournalingBatchObserver();
    insertBatch.addObserver(batchObserver);
    assertTrue("unexpected Batch impl", NonBatchingBatch.class.isInstance(insertBatch));
    PreparedStatement insert = insertBatch.getBatchStatement(insertSql, false);
    insert.setLong(1, 1);
    insert.setString(2, "name");
    assertEquals(0, batchObserver.getExplicitExecutionCount());
    assertEquals(0, batchObserver.getImplicitExecutionCount());
    insertBatch.addToBatch();
    assertEquals(0, batchObserver.getExplicitExecutionCount());
    assertEquals(1, batchObserver.getImplicitExecutionCount());
    assertFalse(jdbcCoordinator.getResourceRegistry().hasRegisteredResources());
    insertBatch.execute();
    assertEquals(1, batchObserver.getExplicitExecutionCount());
    assertEquals(1, batchObserver.getImplicitExecutionCount());
    assertFalse(jdbcCoordinator.getResourceRegistry().hasRegisteredResources());
    insertBatch.release();
    txn.commit();
    session.close();
}
Also used : PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) LogicalConnectionImplementor(org.hibernate.resource.jdbc.spi.LogicalConnectionImplementor) BatchBuilder(org.hibernate.engine.jdbc.batch.spi.BatchBuilder) PreparedStatement(java.sql.PreparedStatement) NonBatchingBatch(org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch) JdbcCoordinator(org.hibernate.engine.jdbc.spi.JdbcCoordinator) JournalingBatchObserver(org.hibernate.test.common.JournalingBatchObserver) Transaction(org.hibernate.Transaction) NonBatchingBatch(org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch) Batch(org.hibernate.engine.jdbc.batch.spi.Batch) BatchingBatch(org.hibernate.engine.jdbc.batch.internal.BatchingBatch) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) BasicBatchKey(org.hibernate.engine.jdbc.batch.internal.BasicBatchKey) BatchKey(org.hibernate.engine.jdbc.batch.spi.BatchKey) BasicBatchKey(org.hibernate.engine.jdbc.batch.internal.BasicBatchKey) BatchBuilderImpl(org.hibernate.engine.jdbc.batch.internal.BatchBuilderImpl) Session(org.hibernate.Session) Test(org.junit.Test)

Example 74 with SessionImplementor

use of org.hibernate.engine.spi.SessionImplementor in project hibernate-orm by hibernate.

the class GeneralWorkTest method testGeneralUsage.

@Test
public void testGeneralUsage() throws Throwable {
    final Session session = openSession();
    session.beginTransaction();
    session.doWork(new Work() {

        public void execute(Connection connection) throws SQLException {
            // in this current form, users must handle try/catches themselves for proper resource release
            Statement statement = null;
            try {
                statement = ((SessionImplementor) session).getJdbcCoordinator().getStatementPreparer().createStatement();
                ResultSet resultSet = null;
                try {
                    resultSet = ((SessionImplementor) session).getJdbcCoordinator().getResultSetReturn().extract(statement, "select * from T_JDBC_PERSON");
                } finally {
                    releaseQuietly(((SessionImplementor) session), resultSet, statement);
                }
                try {
                    ((SessionImplementor) session).getJdbcCoordinator().getResultSetReturn().extract(statement, "select * from T_JDBC_BOAT");
                } finally {
                    releaseQuietly(((SessionImplementor) session), resultSet, statement);
                }
            } finally {
                releaseQuietly(((SessionImplementor) session), statement);
            }
        }
    });
    session.getTransaction().commit();
    session.close();
}
Also used : SQLException(java.sql.SQLException) Statement(java.sql.Statement) Work(org.hibernate.jdbc.Work) ReturningWork(org.hibernate.jdbc.ReturningWork) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) Session(org.hibernate.Session) Test(org.junit.Test)

Example 75 with SessionImplementor

use of org.hibernate.engine.spi.SessionImplementor in project hibernate-orm by hibernate.

the class BasicConnectionTest method testBasicJdbcUsage.

@Test
public void testBasicJdbcUsage() throws JDBCException {
    Session session = openSession();
    SessionImplementor sessionImpl = (SessionImplementor) session;
    JdbcCoordinator jdbcCoord = sessionImpl.getJdbcCoordinator();
    try {
        Statement statement = jdbcCoord.getStatementPreparer().createStatement();
        String dropSql = getDialect().getDropTableString("SANDBOX_JDBC_TST");
        try {
            jdbcCoord.getResultSetReturn().execute(statement, dropSql);
        } catch (Exception e) {
        // ignore if the DB doesn't support "if exists" and the table doesn't exist
        }
        jdbcCoord.getResultSetReturn().execute(statement, "create table SANDBOX_JDBC_TST ( ID integer, NAME varchar(100) )");
        assertTrue(getResourceRegistry(jdbcCoord).hasRegisteredResources());
        assertTrue(jdbcCoord.getLogicalConnection().isPhysicallyConnected());
        getResourceRegistry(jdbcCoord).release(statement);
        assertFalse(getResourceRegistry(jdbcCoord).hasRegisteredResources());
        // after_transaction specified
        assertTrue(jdbcCoord.getLogicalConnection().isPhysicallyConnected());
        PreparedStatement ps = jdbcCoord.getStatementPreparer().prepareStatement("insert into SANDBOX_JDBC_TST( ID, NAME ) values ( ?, ? )");
        ps.setLong(1, 1);
        ps.setString(2, "name");
        jdbcCoord.getResultSetReturn().execute(ps);
        ps = jdbcCoord.getStatementPreparer().prepareStatement("select * from SANDBOX_JDBC_TST");
        jdbcCoord.getResultSetReturn().extract(ps);
        assertTrue(getResourceRegistry(jdbcCoord).hasRegisteredResources());
    } catch (SQLException e) {
        fail("incorrect exception type : sqlexception");
    } finally {
        try {
            session.doWork(connection -> {
                final Statement stmnt = connection.createStatement();
                stmnt.execute(getDialect().getDropTableString("SANDBOX_JDBC_TST"));
            });
        } finally {
            session.close();
        }
    }
    assertFalse(getResourceRegistry(jdbcCoord).hasRegisteredResources());
}
Also used : JdbcCoordinator(org.hibernate.engine.jdbc.spi.JdbcCoordinator) SQLException(java.sql.SQLException) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) PreparedStatement(java.sql.PreparedStatement) SQLException(java.sql.SQLException) JDBCException(org.hibernate.JDBCException) Session(org.hibernate.Session) Test(org.junit.Test)

Aggregations

SessionImplementor (org.hibernate.engine.spi.SessionImplementor)82 Session (org.hibernate.Session)59 Test (org.junit.Test)54 Connection (java.sql.Connection)20 TestForIssue (org.hibernate.testing.TestForIssue)18 PreparedStatement (java.sql.PreparedStatement)17 Work (org.hibernate.jdbc.Work)13 Statement (java.sql.Statement)12 List (java.util.List)12 Transaction (org.hibernate.Transaction)12 EntityPersister (org.hibernate.persister.entity.EntityPersister)12 ResultSet (java.sql.ResultSet)11 SQLException (java.sql.SQLException)11 ArrayList (java.util.ArrayList)7 JDBCException (org.hibernate.JDBCException)6 CollectionEntry (org.hibernate.engine.spi.CollectionEntry)6 EntityEntry (org.hibernate.engine.spi.EntityEntry)6 QueryParameters (org.hibernate.engine.spi.QueryParameters)6 ResultSetProcessor (org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor)6 NamedParameterContext (org.hibernate.loader.plan.exec.query.spi.NamedParameterContext)6