【问题标题】:DbUnit NoSuchTableException with Spring, Hibernate, HSQSLBDbUnit NoSuchTableException 与 Spring、Hibernate、HSQSLB
【发布时间】:2011-12-08 21:39:49
【问题描述】:

我正在为当地学区做一些志愿者发展。他们将 Spring 和 Hibernate 用于基本的 CRUD 应用程序。我能够对开发数据库运行一些 JUnit 测试,但不想使用 DbUnit 对 HSQLDB 进行尝试。

当 DbUnit 从 XML 文件加载初始数据时,我遇到了 NoSuchTableException。我已经阅读了 StackOverflow 上关于此的其他帖子,他们倾向于建议将 Hibernate 属性 hibernate.hbm2ddl.auto 设置为 create-drop。我已经这样做了,但仍然遇到异常。我想知道设置中是否缺少一些基本的东西。

这是我的测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:spring-test-datasource.xml",
        "classpath:spring-test-dao.xml"
})
@Transactional
public class HibernateRitsAdminDaoTest {
    @Autowired protected RitsAdminDao ritsAdminDao;
    @Autowired protected DataSource dataSource;
    protected IDatabaseTester dbTester;

    @Before
    public void setUp() throws Exception {
        dbTester = new DataSourceDatabaseTester(dataSource);
        IDataSet dataSet = new FlatXmlDataSetBuilder().build(new FileInputStream("test/RitsAdminsTest.xml"));
        dbTester.setDataSet(dataSet);
        dbTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        dbTester.onTearDown();
    }

    @Test
    public void testGetAll() throws Exception {
        List<RitsAdmin> ritsAdmins = ritsAdminDao.getAll();
        assertTrue(ritsAdmins.size() > 0);
    }
}

这是我用来填充表格的 DbUnit 数据:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <tbl_sn_rits_admins profile_id="1"/>
    <tbl_sn_rits_admins profile_id="6"/>
    <tbl_sn_rits_admins profile_id="88"/>
</dataset>

这是spring-test-datasource.xml中的数据源定义

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:schoolnet"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

这个 spring-test-dao.xml 定义了 DAO 和 Hibernate 属性:

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>us/mn/k12/district/domain/RitsAdmin.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
            </props>
        </property>
    </bean>

    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

最后,这里是表的 Hibernate 文件:

<hibernate-mapping package="us.mn.k12.district.domain">
    <class name="RitsAdmin" table="tbl_sn_rits_admins" schema="dbo" catalog="schoolnet">
        <id name="profileId" type="long">
            <column name="profile_id" />
        </id>
    </class>
</hibernate-mapping>

请注意,我将休眠属性 hbm2dll.auto 设置为“create-drop”。这是其他 SO 帖子所建议的。这应该在初始化期间创建表,但我得到以下堆栈跟踪:

org.dbunit.dataset.NoSuchTableException: tbl_sn_rits_admins
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at us.mn.k12.district.dao.HibernateRitsAdminDaoTest.setUp(HibernateRitsAdminDaoTest.java:41)
... keeps going...

我缺少一个简单的配置吗? Hibernate 文件中的模式和目录名称是否必须以某种方式与 hsqldb URL 匹配? 任何帮助表示赞赏!

【问题讨论】:

    标签: hibernate spring junit dbunit


    【解决方案1】:

    您的单元测试是否启动了休眠框架。因为看起来您想使用 Hibernate 来创建表。但这仅在您的测试首先“开始”休眠时才有效。

    【讨论】:

    • 没错,先看看你的spring上下文是否加载正确,然后再在hibernate/dbunit中搜索问题。删除该 dbunit 代码,并告诉我们您的 spring bean 是否是 autoriwred 的。
    • 谢谢大家,我删除了 dbunit 代码并指向了一个不同的数据源——我们用于开发的 MSSQL 数据库。我能够从 JUnit 对该数据库运行查询,因此我认为数据源和 DAO bean 加载正确。关于如何“启动”休眠的想法?现在,Hibernate DAO 扩展了另一个具有基本存储、删除、getById 等的 Hibernate 类。该类使用 HibernateTemplate。否则,我会寻找什么来尝试找到 Hibernate 的“启动”位置/如果?谢谢!
    • 如果它适用于普通(不在内存数据库中)但不适用于内存数据库,那么问题可能是您使用了两个不同的内存数据库,或者数据库“关闭”初始化后。
    • 发现 DbUnit 通过 .. 查询,在我的例子中查询表 schoolnet.dbo.tbl_sn_rits_admins。如果我在 DbUnit 平面 XML 文件中将表名设置为 schoolnet.dbo.tbl_sn_rits_admins,我仍然会收到 NoSuchTableException。如果我从 Hibernate XML 文件中删除模式和目录属性,则 DbUnit 和 HSQLDB 运行良好。现在,我正在考虑将表的目录和模式属性从 Hibernate XML 文件中移出并移到 Spring XML 文件中。拥有单独的测试和生产 Spring XML 文件是一种常见的习惯用法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多