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