每次连接数据库时,Hibernate 4都会创建临时表,
Hibernate: create table HT_.....
有没有办法只创建一次它们?
答案 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 );
}
}