在Hibernate 3.3.1ga和HSQLDB中使用带有模式名称的@Table

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

Ada*_*ter 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,导致架构及时存在.这也应该让你的意图更清晰.


Aar*_*lla 1

我当前的解决方案如下所示:

@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)

但这感觉就像一个非常丑陋的黑客。难道就没有更好的解决办法吗?