Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.dbunit.dataset.NoSuchTableException:未找到表';xxx和x27;在模式中';空';_Java_Hibernate_Spring_Dbunit - Fatal编程技术网

Java org.dbunit.dataset.NoSuchTableException:未找到表';xxx和x27;在模式中';空';

Java org.dbunit.dataset.NoSuchTableException:未找到表';xxx和x27;在模式中';空';,java,hibernate,spring,dbunit,Java,Hibernate,Spring,Dbunit,我知道这里已经和dbunit讨论过了。我读过其中的大部分,但似乎找不到解决问题的办法 我已经设置了hibernate和spring。我正在做TDD,所以在编写代码之前,我必须建立一个适当的DAO测试框架。Dbunit出现在我脑海中,我开始设置它。下面是ma testdataset.xml <?xml version='1.0' encoding='UTF-8'?> <dataset> <table name="status">

我知道这里已经和dbunit讨论过了。我读过其中的大部分,但似乎找不到解决问题的办法

我已经设置了hibernate和spring。我正在做TDD,所以在编写代码之前,我必须建立一个适当的DAO测试框架。Dbunit出现在我脑海中,我开始设置它。下面是ma testdataset.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
        <table name="status">
            <column>statusId</column>
            <column>status</column>
            <row>
                <value>0</value>
                <value>Available</value>
            </row>
        </table>
        <table name="user">
            <column>userId</column>
            <column>firstName</column>
            <column>lastName</column>
            <column>username</column>
            <column>password</column>
            <column>email</column>
            <row>
                <value>0</value>
                <value>system</value>
                <value>admin</value>
                <value>admin</value>
                <value>admin</value>
                <value>admin@ccbs.com</value>
            </row>
        </table>
        <table name="reservation">
            <column>reservationId</column>
            <column>userId</column>
            <column>reservationDate</column>
            <column>startDate</column>
            <column>endDate</column>
            <column>statusId</column>
            <row>
                <value>0</value>
                <value>0</value>
                <value>2011-02-20 12:46:00.0</value>
                <value>2011-03-01 12:00:00.0</value>
                <value>2011-04-01 12:00:00.0</value>
                <value>0</value>
            </row>
        </table>
    </dataset>
只要它点击
DatabaseOperation.CLEAN\u INSERT.execute(连接,testDataset)它引发以下异常:

org.dbunit.dataset.NoSuchTableException: Did not find table 'USER' in schema 'null'
at org.dbunit.database.DatabaseTableMetaData.<init>(DatabaseTableMetaData.java:142)
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at com.cottage.test.BaseContextSensitiveTest.init(BaseContextSensitiveTest.java:64)
org.dbunit.dataset.NoSuchTableException:在架构“null”中未找到表“USER”
位于org.dbunit.database.DatabaseTableMetaData(DatabaseTableMetaData.java:142)
位于org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290)
位于org.dbunit.operation.deleteAllooperation.execute(deleteAllooperation.java:109)
在org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
位于com.slotch.test.baseContextSensiveTest.init(baseContextSensiveTest.java:64)
我已经准备好了所有的hibernate映射文件,并且数据库已经设置好,没有任何数据。有趣的事情(或者恼人的事情取决于您如何看待它)是,如果我更改数据集中表的顺序,missingtableexception会抱怨另一个表。。。用户、预订或状态


关于我可能做错了什么有什么建议吗?

您是否在数据库中创建了数据库表

dbunit
不适合您,因为它不知道预期的数据库结构。不过,您可以让Hibernat来做。使用
hbm2ddl
标志,例如:

 <property name="hibernate.hbm2ddl.auto" value="create-drop"/>


我找不到该标志的主要文档,但是如果您搜索它,您会得到很多结果,包括。

DBUnit不会为您创建数据库表,因为它从数据集xml获取的信息有限,无法创建预期的数据库模式

当与hibernate一起使用时,它需要为每个pojo(您正试图映射到内存中的测试数据库表)提供适当的hbm映射文件,这些文件最终将在测试中使用。如果没有映射文件,您将得到
org.dbunit.dataset.NoSuchTableException:在架构“yyy”中未找到表“xxx”

此外,还需要一个有效的hibernate.cfg.xml,并正确配置所有hibernate映射文件

通过在属性文件中设置此属性
hibernate.hbm2ddl.auto=create drop
,可以将数据库创建委托给hibernate


错误消息有点误导。应该包含更多关于缺少hibernate映射文件的信息,但这是DBunit wiki上的讨论。

删除dataset.xml文件中的第一行

换成这个

否则,DBUnit将尝试从DTD文件加载db tables架构,如果未提供DTD,它将永远不会在任何表上匹配。使用普通xml头将导致DBUnit跳过引发您看到的错误的DTD表检查

您还必须像Grzegorz那样,让hibernate通过包括


configuration.setProperty(Environment.HBM2DDL_AUTO,“创建拖放”)

您可能对此感兴趣。我也发现了这个错误,通过将hibernate.cfg.xml中的表从“message”重命名为“message”,它能够找到模式


让我知道这是否也适用于您。

我也遇到了同样的错误,上面接受的修复程序没有解决我的问题。但我还是找到了解决办法

我的设置包括DBUnit(2.4)、EclipseLink(2.1)作为我的JPA提供者,以及Postgres作为我的后端数据库。另外,在我的场景中,我没有为每个测试运行删除和重新创建表。我的测试数据已经存在。我知道这是一个糟糕的实践,但更多的是一个测试/原型场景。下面的代码说明了用于修复我的问题的DBUnit配置

54    // ctx represents a spring context
55    DataSource ds = (DataSource)ctx.getBean("myDatasourceBean");
56    Connection conn = DataSourceUtils.getConnection(ds);
57    IDatabaseConnection dbUnitConn = new DatabaseConnection(conn, "public");
58    DatabaseConfig dbCfg = dbUnitConn.getConfig();
59    dbCfg.setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
60    IDataSet dataSet = new FlatXmlDataSet(ClassLoader.getSYstemResourceAsStream("mydbunitdata.xml"));
61    DatabaseOperation.REFRESH.execute(dbUnitConn, dataSet);
上面代码中的两件事解决了我的问题。首先,我需要定义DBUnit应该使用的模式。这是在上面第57行完成的。设置新数据库连接时,如果架构(“public”)不为null,则应传入该架构


其次,我需要DBUnit对数据库表名区分大小写。在我的dbunitxml文件(“mydbunitdata.xml”)中,表名都是小写的,就像在数据库中一样。但是,如果您不告诉DBUnit使用区分大小写的表名,它会查找Postgres不喜欢的大写表名。因此,我需要在DBUnit中设置区分大小写的功能,这是在第59行完成的。

我遇到了相同的错误,在hibernate.cfg.xml中配置了我的实体,并且我正在使用hbm2ddl生成表,所以我继续搜索,发现我的实体映射包含一个名为“POSITION”的字段,它是一个保留项。当我将其更改为“POS”时,表生成正确

您可以通过在中调试resultSet迭代来检查是否正在生成表


org.dbunit.database.DatabaseDataSet.initialize()。

dbunit类从数据库中获取默认模式,如果要使用的模式不是默认模式,则需要在.xml文件中设置所需的模式,并启用其他模式的识别选项,请参阅下面的解决方案。我创造了它

Example.xml-多个架构

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <SCHEMA1.NAME_TABLE id="5" userName="1" />
    <SCHEMA2.NAME_TABLE id="2" roleName="1" />
<dataset>


<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <PEOPLE.USER id="5" userName="1" />
    <FUNCTIONS.ROLE id="2" roleName="1" />
<dataset>

如果将架构名称预先挂起到表名状态-->myschema.status?@Luciano Fiandesio,您的意思是在创建IDatabaseConnection dbUnitConn=新数据库连接(连接,“架构?名称”)时会发生什么情况?否,我的意思是,在xml数据集中,你的JDBC连接字符串是什么样子的?@Luciano Fiandesio:我试过了,但还是出现了同样的错误。仅在“缺少的表”前面加上架构名称。谢谢@Grzegorz
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <SCHEMA1.NAME_TABLE id="5" userName="1" />
    <SCHEMA2.NAME_TABLE id="2" roleName="1" />
<dataset>


<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <PEOPLE.USER id="5" userName="1" />
    <FUNCTIONS.ROLE id="2" roleName="1" />
<dataset>
    @Before
    public void initialize() throws Exception{
        //Insert data into database
        DatabaseOperation.CLEAN_INSERT.execute(getConnection(), getDataSet());
    }

    @After
    public void cleanup() throws Exception{
     //Clean up the database
      DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet());
      System.out.println("DELETADO COM SUCESSO!");

    }

    private IDatabaseConnection getConnection() throws Exception{
            // Get the database connection
            Connection con = dataSource.getConnection();
            DatabaseMetaData  databaseMetaData = con.getMetaData();
            DatabaseConnection connection = new DatabaseConnection(con,databaseMetaData.getUserName().toUpperCase());
            //Allow multiple schemas to be used
            connection.getConfig().setFeature(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);
            return connection;    
    }

    private IDataSet getDataSet() throws Exception{
        //Get file to insert
        File file = new File("src/test/resources/Example.xml");
        return new FlatXmlDataSet(file);
}