Search in sources :

Example 1 with SessionFactoryImpl

use of org.hibernate.internal.SessionFactoryImpl in project hibernate-orm by hibernate.

the class EntityManagerFactoryUnwrapTest method testEntityManagerCanBeUnwrappedToSessionFactoryImpl.

@Test
public void testEntityManagerCanBeUnwrappedToSessionFactoryImpl() {
    SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
    assertNotNull("Unwrapping to SessionFactoryImpl should be ok", sessionFactory);
}
Also used : SessionFactoryImpl(org.hibernate.internal.SessionFactoryImpl) Test(org.junit.Test)

Example 2 with SessionFactoryImpl

use of org.hibernate.internal.SessionFactoryImpl in project midpoint by Evolveum.

the class OrgClosureManager method autoUpdateClosureTableStructure.

// TEMPORARY and quite BRUTAL HACK
// Originally in midPoint 3.0, m_org_closure has 5 columns, a non-null ID among them.
// In 3.1, it has 3, and no ID. Unfortunately, hibernate's hbm2ddl tool does not automatically remove ID column,
// so people can expect quite hard-to-understand error messages when running midPoint after upgrade.
//
// This code removes and re-creates the m_org_closure table if hbm2ddl is set to "update".
//
// returns true if the table was re-created
private boolean autoUpdateClosureTableStructure() {
    if (baseHelper.getConfiguration().isSkipOrgClosureStructureCheck()) {
        LOGGER.debug("Skipping org closure structure check.");
        return false;
    }
    SessionFactory sf = baseHelper.getSessionFactory();
    if (sf instanceof SessionFactoryImpl) {
        SessionFactoryImpl sfi = ((SessionFactoryImpl) sf);
        LOGGER.debug("SessionFactoryImpl.getSettings() = {}; auto update schema = {}", sfi.getSettings(), sfi.getSettings() != null ? sfi.getSettings().isAutoUpdateSchema() : null);
        if (sfi.getSettings() != null && sfi.getSettings().isAutoUpdateSchema()) {
            LOGGER.info("Checking the closure table structure.");
            final Session session = baseHelper.getSessionFactory().openSession();
            final Holder<Boolean> wrongNumberOfColumns = new Holder<>(false);
            session.doWork(new Work() {

                @Override
                public void execute(Connection connection) throws SQLException {
                    DatabaseMetaData meta = connection.getMetaData();
                    if (meta == null) {
                        LOGGER.warn("No database metadata found.");
                    } else {
                        ResultSet rsColumns = meta.getColumns(null, null, CLOSURE_TABLE_NAME, null);
                        int columns = 0;
                        while (rsColumns.next()) {
                            LOGGER.debug("Column: {} {}", rsColumns.getString("TYPE_NAME"), rsColumns.getString("COLUMN_NAME"));
                            columns++;
                        }
                        if (columns > 0) {
                            LOGGER.debug("There are {} columns in {} (obtained via DatabaseMetaData)", columns, CLOSURE_TABLE_NAME);
                            if (columns != 3) {
                                wrongNumberOfColumns.setValue(true);
                            }
                            return;
                        }
                        // perhaps some problem here... let's try another way out
                        try {
                            Statement stmt = connection.createStatement();
                            ResultSet rs = stmt.executeQuery("select * from " + CLOSURE_TABLE_NAME);
                            int cols = rs.getMetaData().getColumnCount();
                            if (cols > 0) {
                                LOGGER.debug("There are {} columns in {} (obtained via resultSet.getMetaData())", cols, CLOSURE_TABLE_NAME);
                                if (cols != 3) {
                                    wrongNumberOfColumns.setValue(true);
                                }
                            } else {
                                LOGGER.warn("Couldn't determine the number of columns in {}. In case of problems, please fix your database structure manually using DB scripts in 'config' folder.", CLOSURE_TABLE_NAME);
                            }
                            // don't care about closing them in case of failure
                            rs.close();
                            stmt.close();
                        } catch (RuntimeException e) {
                            LoggingUtils.logException(LOGGER, "Couldn't obtain the number of columns in {}. In case of problems running midPoint, please fix your database structure manually using DB scripts in 'config' folder.", e, CLOSURE_TABLE_NAME);
                        }
                    }
                }
            });
            if (wrongNumberOfColumns.getValue()) {
                session.getTransaction().begin();
                LOGGER.info("Wrong number of columns detected; dropping table " + CLOSURE_TABLE_NAME);
                Query q = session.createSQLQuery("drop table " + CLOSURE_TABLE_NAME);
                q.executeUpdate();
                session.getTransaction().commit();
                LOGGER.info("Calling hibernate hbm2ddl SchemaUpdate tool to create the table in the necessary form.");
                new SchemaUpdate(sfi.getServiceRegistry(), baseHelper.getSessionFactoryBean().getConfiguration()).execute(false, true);
                LOGGER.info("Done, table was (hopefully) created. If not, please fix your database structure manually using DB scripts in 'config' folder.");
                return true;
            }
        } else {
        // auto schema update is disabled
        }
    } else {
        LOGGER.warn("SessionFactory is not of type SessionFactoryImpl; it is {}", sf != null ? sf.getClass() : "null");
    }
    return false;
}
Also used : SessionFactory(org.hibernate.SessionFactory) Query(org.hibernate.Query) ObjectQuery(com.evolveum.midpoint.prism.query.ObjectQuery) SQLException(java.sql.SQLException) Statement(java.sql.Statement) Holder(com.evolveum.midpoint.util.Holder) Connection(java.sql.Connection) SchemaUpdate(org.hibernate.tool.hbm2ddl.SchemaUpdate) DatabaseMetaData(java.sql.DatabaseMetaData) Work(org.hibernate.jdbc.Work) ResultSet(java.sql.ResultSet) SessionFactoryImpl(org.hibernate.internal.SessionFactoryImpl) Session(org.hibernate.Session)

Example 3 with SessionFactoryImpl

use of org.hibernate.internal.SessionFactoryImpl in project midpoint by Evolveum.

the class SqlRepositoryServiceImpl method readDetailsFromConnection.

private void readDetailsFromConnection(RepositoryDiag diag, final SqlRepositoryConfiguration config) {
    final List<LabeledString> details = diag.getAdditionalDetails();
    Session session = baseHelper.getSessionFactory().openSession();
    try {
        session.beginTransaction();
        session.doWork(new Work() {

            @Override
            public void execute(Connection connection) throws SQLException {
                details.add(new LabeledString(DETAILS_TRANSACTION_ISOLATION, getTransactionIsolation(connection, config)));
                Properties info = connection.getClientInfo();
                if (info == null) {
                    return;
                }
                for (String name : info.stringPropertyNames()) {
                    details.add(new LabeledString(DETAILS_CLIENT_INFO + name, info.getProperty(name)));
                }
            }
        });
        session.getTransaction().commit();
        SessionFactory sessionFactory = baseHelper.getSessionFactory();
        if (!(sessionFactory instanceof SessionFactoryImpl)) {
            return;
        }
        SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) sessionFactory;
        // we try to override configuration which was read from sql repo configuration with
        // real configuration from session factory
        String dialect = sessionFactoryImpl.getDialect() != null ? sessionFactoryImpl.getDialect().getClass().getName() : null;
        details.add(new LabeledString(DETAILS_HIBERNATE_DIALECT, dialect));
    } catch (Throwable th) {
        //nowhere to report error (no operation result available)
        session.getTransaction().rollback();
    } finally {
        baseHelper.cleanupSessionAndResult(session, null);
    }
}
Also used : SessionFactory(org.hibernate.SessionFactory) SQLException(java.sql.SQLException) Work(org.hibernate.jdbc.Work) Connection(java.sql.Connection) PolyString(com.evolveum.midpoint.prism.polystring.PolyString) Properties(java.util.Properties) SessionFactoryImpl(org.hibernate.internal.SessionFactoryImpl) Session(org.hibernate.Session)

Aggregations

SessionFactoryImpl (org.hibernate.internal.SessionFactoryImpl)3 Connection (java.sql.Connection)2 SQLException (java.sql.SQLException)2 Session (org.hibernate.Session)2 SessionFactory (org.hibernate.SessionFactory)2 Work (org.hibernate.jdbc.Work)2 PolyString (com.evolveum.midpoint.prism.polystring.PolyString)1 ObjectQuery (com.evolveum.midpoint.prism.query.ObjectQuery)1 Holder (com.evolveum.midpoint.util.Holder)1 DatabaseMetaData (java.sql.DatabaseMetaData)1 ResultSet (java.sql.ResultSet)1 Statement (java.sql.Statement)1 Properties (java.util.Properties)1 Query (org.hibernate.Query)1 SchemaUpdate (org.hibernate.tool.hbm2ddl.SchemaUpdate)1 Test (org.junit.Test)1