如何在hibernate 4中禁用临时表娱乐?

时间:2014-04-26 01:04:02

标签: hibernate

每次连接数据库时,Hibernate 4都会创建临时表,

Hibernate: create table HT_.....

有没有办法只创建一次它们?

2 个答案:

答案 0 :(得分:1)

有一天,我也在寻找相同的但没有获得成功,但我发现very nice article解释了为什么这个Hibernate临时表是必要的,这是我们非常清楚的,但是在阅读之后明确表示它不可能是完成。每当批量操作被解雇时,ORM框架都会创建它。

我认为没有比Hibernate在这里提供更好的解决方案,但我认为这是一个以巧妙的方式解决的错误问题。

答案 1 :(得分:1)

我确实理解了目的,但问题出在我的情况下,当用户选择相同的数据库时,需要10个secondes来重新创建所有临时表,所以这里如何避免: 我添加这部分

if (e.toString().contains("already exists")) /********* temporary tables exists we should break ********/
    break;

到类org.hibernate.hql.spi.PersistentTableBulkIdStrategy

protected void exportTableDefinitions(
            List<Table> idTableDefinitions,
            JdbcServices jdbcServices,
            JdbcConnectionAccess connectionAccess,
            Mappings mappings,
            Mapping mapping) {
        try {
            Connection connection;
            try {
                connection = connectionAccess.obtainConnection();
            }
            catch (UnsupportedOperationException e) {
                // assume this comes from org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl
                log.debug( "Unable to obtain JDBC connection; assuming ID tables already exist or wont be needed" );
                return;
            }

            try {
                // TODO: session.getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().createStatement();
                Statement statement = connection.createStatement();
                for ( Table idTableDefinition : idTableDefinitions ) {
                    if ( cleanUpTables ) {
                        if ( tableCleanUpDdl == null ) {
                            tableCleanUpDdl = new ArrayList<String>();
                        }
                        tableCleanUpDdl.add( idTableDefinition.sqlDropString( jdbcServices.getDialect(), null, null  ) );
                    }
                    try {
                        final String sql = idTableDefinition.sqlCreateString( jdbcServices.getDialect(), mapping, null, null );
                        jdbcServices.getSqlStatementLogger().logStatement( sql );
                        // TODO: ResultSetExtractor
                        statement.execute( sql );
                    }
                    catch (SQLException e) {
if (e.toString().contains("already exists")) /********* temporary tables exists we should break ********/
    break;
                        log.debugf( "Error attempting to export id-table [%s] : %s", idTableDefinition.getName(), e.getMessage() );
                    }
                }

                // TODO
//              session.getTransactionCoordinator().getJdbcCoordinator().release( statement );
                statement.close();
            }
            catch (SQLException e) {
                log.error( "Unable to use JDBC Connection to create Statement", e );
            }
            finally {
                try {
                    connectionAccess.releaseConnection( connection );
                }
                catch (SQLException ignore) {
                }
            }
        }
        catch (SQLException e) {
            log.error( "Unable obtain JDBC Connection", e );
        }
    }