如何在Hibernate4中禁用临时表?

如何在Hibernate4中禁用临时表?,hibernate,Hibernate,Hibernate 4每次连接到数据库时都会创建临时表 Hibernate: create table HT_..... 有没有办法只创建一次它们?有一天,我也在搜索相同的表,但没有成功,但我发现这解释了为什么必须使用Hibernate临时表,这是我们非常清楚的,但在阅读本文之后,很清楚这是不可能做到的。无论何时触发批量操作,ORM框架都将创建它 我认为没有比Hibernate在这里提供的更好的解决方案,但我确实认为这是一个错误的问题,用一种巧妙的方式解决了。我确实理解其目的,但问题是在我的情

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

Hibernate: create table HT_.....

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

有一天,我也在搜索相同的表,但没有成功,但我发现这解释了为什么必须使用Hibernate临时表,这是我们非常清楚的,但在阅读本文之后,很清楚这是不可能做到的。无论何时触发批量操作,ORM框架都将创建它


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

我确实理解其目的,但问题是在我的情况下,当用户选择相同的数据库时,需要10秒钟来重新创建所有临时表,因此如何避免这种情况: 我加上这一部分

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 );
        }
    }

我确实理解其目的,但问题是在我的情况下,当用户选择相同的数据库时,创建所有临时数据库需要10秒钟tables@NassimMOUALEK您是否尝试手动创建所有表,然后选择相同的数据库。Hibernate将检查温度。表已创建,因此不会再次创建。这只是我没有尝试过的想法。我阅读、测试和检查PersistentTableBulkIdStrategy类,它不会测试是否已经创建了表,解决方案是更改代码,正如我在下面提到的