zcu.xutil.orm.SessionFactoryBean.java Source code

Java tutorial

Introduction

Here is the source code for zcu.xutil.orm.SessionFactoryBean.java

Source

/*
 * Copyright 2009 zaichu xiao
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package zcu.xutil.orm;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.service.jta.platform.internal.AbstractJtaPlatform;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory;

import zcu.xutil.sql.DBTool;
import zcu.xutil.txm.SmartDataSource;
import zcu.xutil.txm.TxManager;

/**
 * 
 * @author <a href="mailto:zxiao@yeepay.com">xiao zaichu</a>
 */
public final class SessionFactoryBean {
    private final DataSource dataSource;
    private final Configuration configure;

    public SessionFactoryBean(DataSource datasource, Configuration configuration) {
        this.configure = configuration;
        this.dataSource = SmartDataSource.wrap(datasource);
    }

    public SessionFactory getObject() {
        configure.getProperties().put(AvailableSettings.DATASOURCE, dataSource);
        configure.setProperty(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, XutilSessionContext.class.getName());
        if (TxManager.getTxManager().getUserTransaction() != null) {
            configure.setProperty(AvailableSettings.JTA_PLATFORM, JTA.class.getName());
            configure.setProperty(AvailableSettings.TRANSACTION_STRATEGY, JtaTransactionFactory.class.getName());
        }
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties())
                .buildServiceRegistry();
        return configure.buildSessionFactory(serviceRegistry);
    }

    public void dropDatabaseSchema() throws SQLException {
        Dialect dialect = Dialect.getDialect(configure.getProperties());
        String[] sqls = configure.generateDropSchemaScript(dialect);
        Connection conn = dataSource.getConnection();
        try {
            for (String sql : sqls)
                DBTool.update(conn, sql);
        } finally {
            conn.close();
        }
    }

    public void createDatabaseSchema() throws SQLException {
        Dialect dialect = Dialect.getDialect(configure.getProperties());
        String[] sqls = configure.generateSchemaCreationScript(dialect);
        Connection conn = dataSource.getConnection();
        try {
            for (String sql : sqls)
                DBTool.update(conn, sql);
        } finally {
            conn.close();
        }
    }

    public final static class JTA extends AbstractJtaPlatform {
        private static final long serialVersionUID = 1L;

        @Override
        protected TransactionManager locateTransactionManager() {
            return TxManager.getTxManager().getTransactionManager();
        }

        @Override
        protected UserTransaction locateUserTransaction() {
            return TxManager.getTxManager().getUserTransaction();
        }
    }
}