Aar*_*lla 6 schema spring hibernate hsqldb
如何使用Hibernate 3.3.1ga和HSQLDB在单元测试中完成这项工作:
@Entity
@Table(name="CATEGORY", schema="TEST")
public static class Category { ... }
Run Code Online (Sandbox Code Playgroud)
问题是Hibernate期望架构存在.第二个问题是Hibernate CREATE TABLE TEST.CATEGORY在我的任何代码运行之前发出(这发生在Spring的测试设置中),因此我无法在Hibernate之前获得与DB的连接并手动创建模式.
但我需要架构,因为我必须访问实际代码中的不同数据库.我该怎么办?
Hibernate 3.3.1ga,HSQLDB,Spring 2.5
您可以编写一个实现InitializingBean的类:
public class SchemaCreator implements InitializingBean {
private String schema;
private DataSource dataSource;
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void afterPropertiesSet() throws Exception {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute("CREATE SCHEMA " + schema + " AUTHORIZATION DBA");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您必须在此类的bean定义文件中定义一个bean(我正在黑暗中了解您现有的bean定义的样子).
<bean id="dataSource" class="...">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:test"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="sessionFactory" depends-on="schemaCreator" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
...
</bean>
<bean id="schemaCreator" class="SchemaCreator">
<property name="dataSource" ref="dataSource"/>
<property name="schema" value="TEST"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
通过使用depends-onHibernate bean 的属性,Spring将确保schemaCreator首先初始化bean,导致架构及时存在.这也应该让你的意图更清晰.
我当前的解决方案如下所示:
@Override
protected String[] getConfigLocations() {
createHSQLDBSchemas ();
return new String[]{
"test-spring-config.xml"
};
}
private static boolean hsqldbSchemasCreated = false;
public static void createHSQLDBSchemas ()
{
if (hsqldbSchemasCreated)
return;
try
{
log.info ("createHSQLDBSchemas");
Class.forName("org.hsqldb.jdbcDriver").newInstance();
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", "");
Statement stmt = c.createStatement ();
String sql;
sql = "CREATE SCHEMA xxx AUTHORIZATION DBA";
log.info (sql);
stmt.execute (sql);
stmt.close ();
c.close ();
}
catch (Exception e)
{
throw new ShouldNotHappenException (e);
}
hsqldbSchemasCreated = true;
}
Run Code Online (Sandbox Code Playgroud)
但这感觉就像一个非常丑陋的黑客。难道就没有更好的解决办法吗?
| 归档时间: |
|
| 查看次数: |
24728 次 |
| 最近记录: |