【问题标题】:Junit testing with in-memory hsqldb, hibernate and liquibase使用内存中的 hsqldb、hibernate 和 liquibase 进行 Junit 测试
【发布时间】:2014-09-30 16:12:16
【问题描述】:

我正在尝试使用 HSQLDB 来运行一些集成测试。 我使用弹簧。 Hibernate 用于设置数据库模式。 然后我想使用 liquibase 插入测试数据。

我的问题是,虽然休眠模式创建工作正常,但我得到了:

liquibase.exception.DatabaseException: Error executing SQL INSERT INTO PUBLIC.OxAttributeType (id, "alias") VALUES ('1', 'varchar'): user lacks privilege or object not found: alias

当 liquibase 尝试开始插入时。

我认为这可能是由于 hsqldb 在创建休眠模式后关闭(并刷新)造成的,但我不确定。

这是我的配置:

database.properties:

jdbc.driverClassName= org.hsqldb.jdbc.JDBCDriver
jdbc.url=jdbc:hsqldb:mem:oxandtestdatabase
jdbc.username: SA
jdbc.password:

休眠对象:

@Entity
@Table(name = "oxattribute")
public class Oxattribute implements java.io.Serializable {
private Integer id;
private String alias;

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
    return this.id;
}

public void setId(Integer id) {
    this.id = id;
}

@Column(name = "alias", nullable = false, length = 30)
public String getAlias() {
    return this.alias;
}
}

弹簧配置:

<bean id="hibernateProperties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <!-- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> -->
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
    <property name="dataSource" ref="dataSource" />
    <property name="changeLog" value="classpath:liquibase/testData.xml" />
</bean>

所以 Hibernate 正在工作,我可以在日志中看到:

Hibernate: create table oxattribute (id integer generated by default as identity (start with 1), alias varchar(30) not null, deletable boolean not null, description varchar(255), idOxAttributeType integer not null, idOxObject integer not null, primary key (id))

但是当 liquibase 开始插入时:

SEVERE 07/08/14 13:59: liquibase: classpath:liquibase/testData.xml: classpath:liquibase/testData.xml::insertMetadata::GCH: Change Set classpath:liquibase/testData.xml::insertMetadata::GCH failed.  Error: Error executing SQL INSERT INTO PUBLIC.OxAttributeType (id, "alias") VALUES ('1', 'varchar'): user lacks privilege or object not found: alias
liquibase.exception.DatabaseException: Error executing SQL INSERT INTO PUBLIC.OxAttributeType (id, "alias") VALUES ('1', 'varchar'): user lacks privilege or object not found: alias

有关信息,我的代码在 mysql 数据库上运行良好。 谢谢您的帮助, 纪尧姆

【问题讨论】:

  • 嗨,我正在运行 4.3.6.Final 和 hsqldb 2.3.2,可能是最后一个版本。而且我的 setter 已经有了属性 (name = "id")。
  • 对我来说,看起来我对 hsqldb 的开始和结束控制得不够好。我认为它是为休眠创建的,然后销毁,然后为 liquibase 插入创建一个全新的。不过,我对此没有任何证据......我可以想象的其他错误将是 PUBLIC 模式的问题? Hibernate 和 liquibase 不使用相同的模式?但同样,也没有证据证明这一点。

标签: spring hibernate hsqldb liquibase in-memory-database


【解决方案1】:

更改所用列的名称(“别名”是保留词)。您可以尝试添加反引号“`”。 @Column(name="`别名`")。

【讨论】:

  • 该死的你是对的!在 MySQL 中没问题,但在 HSQL 中保留!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 2015-06-23
  • 2011-02-21
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2013-03-09
  • 2013-05-14
相关资源
最近更新 更多