在发布之前我搜索了一下,我在dbunit-user中寻找 档案和DbUnit错误列表中的一点,但我找不到什么 寻找。 不幸的是,答案here也没有帮助我。
我正在使用DbUnit 2.4.8和MySQL 5.1.x在setUp中填充一些JForum表。 问题首先出现在由此脚本
创建的jforum_users表中CREATE TABLE `jforum_users` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`user_active` TINYINT(1) NULL DEFAULT NULL,
`username` VARCHAR(50) NOT NULL DEFAULT '',
`user_password` VARCHAR(32) NOT NULL DEFAULT '',
[...]
PRIMARY KEY (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=14
执行REFRESH作为数据库设置操作会引发以下异常。
org.dbunit.dataset.NoSuchColumnException: jforum_users.USER_ID -
(Non-uppercase input column: USER_ID) in ColumnNameToIndexes cache
map. Note that the map's column names are NOT case sensitive.
at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117)
at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:98)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at net.jforum.dao.generic.AbstractDaoTest.setUpDatabase(AbstractDaoTest.java:43)
我查看了AbstractTableMetaData.java
来源,似乎没有什么 - 似乎是错误的。
方法
private Map createColumnIndexesMap(Column[] columns)
用途
columns[i].getColumnName().toUpperCase()
写地图键。 然后是方法
public int getColumnIndex(String columnName)
用途
String columnNameUpperCase = columnName.toUpperCase();
Integer colIndex = (Integer) this._columnsToIndexes.get(columnNameUpperCase);
从地图上读取对象。
我真的无法理解正在发生的事情...... 有人可以帮帮我吗?
在最后一次@limc回答后编辑
我正在使用PropertiesBasedJdbcDatabaseTester
来配置我的DbUnit env,如下所示:
Properties dbProperties = new Properties();
dbProperties.load(new FileInputStream(testConfDir+"/db.properties"));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA,
dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA));
databaseTester = new PropertiesBasedJdbcDatabaseTester();
databaseTester.setSetUpOperation(getSetUpOperation());
databaseTester.setTearDownOperation(getTearDownOperation());
IDataSet dataSet = getDataSet();
databaseTester.setDataSet(dataSet);
databaseTester.onSetup();
答案 0 :(得分:6)
今天我遇到了类似的问题(使用v2.2中针对MySQL添加的IDatabaseTester接口)并花了几个小时撕掉我的头发。 OP使用的是PropertiesBasedJdbcDatabaseTester,而我正在使用它的父母' JdbcDatabaseTester。
DBUnit有a FAQ answer related to this NoSuchColumnException(特定于MySQL),但对我来说这似乎是疏忽,它忽略了提到从interface's getConnection() method中提取的每个连接将具有单独的配置。事实上,考虑到我今天看到的各种doco的措辞和所涉及的类的名称(例如,DatabaseConfig,但每个连接?),我甚至称它为bug。
无论如何,在像setup / teardown这样的代码部分(下面的示例)中,您甚至不提供Connection对象,因此我无法在那里看到设置配置。
dbTester.setDataSet(beforeData);
dbTester.onSetup();
最后,我只是将JdbcDatabaseTester扩展为@Override getConnection()方法,并每次都注入特定于MySQL的配置:
class MySQLJdbcDatabaseTester extends org.dbunit.JdbcDatabaseTester {
public MySQLJdbcDatabaseTester(String driverClass, String connectionUrl, String username, String password,
String schema) throws ClassNotFoundException {
super(driverClass, connectionUrl, username, password, schema);
}
@Override
public IDatabaseConnection getConnection() throws Exception {
IDatabaseConnection connection = super.getConnection();
DatabaseConfig dbConfig = connection.getConfig();
dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
dbConfig.setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
return connection;
}
}
最后所有的错误都消失了。
答案 1 :(得分:3)
我有理由相信问题源于user_id
列作为记录ID。我在过去有类似的问题,其中行ID是由SQL Server本机生成的。我现在不在我的办公桌,但尝试这个解决方案,看它是否有帮助:http://old.nabble.com/case-sensitivity-on-tearDown--td22964025.html
更新 - 02-03-11
我这里有一个有效的解决方案。这是我的测试代码: -
MySQL脚本
CREATE TABLE `jforum_users` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`user_active` TINYINT(1) NULL DEFAULT NULL,
`username` VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=14
dbunit-test.xml测试文件
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<jforum_users user_id="100" username="First User" />
</dataset>
Java代码
Class.forName("com.mysql.jdbc.Driver");
Connection jdbcConnection = DriverManager.getConnection("jdbc:mysql://localhost:8889/test", "", "");
IDatabaseConnection con = new DatabaseConnection(jdbcConnection);
InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit-test.xml");
IDataSet dataSet = new FlatXmlDataSetBuilder().build(is);
DatabaseOperation.CLEAN_INSERT.execute(con, dataSet);
con.close();
我没有收到任何错误,并且该行已添加到数据库中。
仅供参考,我确实尝试了REFRESH
并且工作正常但没有错误: -
DatabaseOperation.REFRESH.execute(con, dataSet);
我正在使用DBUnit 2.4.8和MySQL 5.1.44。
希望这有帮助。
答案 2 :(得分:2)
我来这里寻找这个问题的答案。对我来说问题是Hibernate命名策略。我意识到这是问题,因为show_sql在Spring的application.properties中是真的:
spring.jpa.show-sql=true
我可以看到生成的表格SQL和字段名称是&#39; FACT_NUMBER&#39;而不是&#39; factNumber&#39;我有我的dbunit的xml。
这是通过强制使用默认命名策略来解决的(具有讽刺意味的是,默认值似乎是org.hibernate.cfg.ImprovedNamingStrategy
,它会放入&#39; _&#39;):
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
答案 3 :(得分:2)
当我收到此错误时,原因是我的架构对列有一个非空约束,但我的数据文件中缺少此列。
例如,我的表有
<table name="mytable">
<column>id</column>
<column>entity_type</column>
<column>deleted</column>
</table>
<dataset>
<mytable id="100" entity_type"2"/>
</dataset>
我对已删除的列有一个非null约束,当我运行测试时,我得到NoSuchColumnException。
当我将数据集更改为
时<mytable id="100" entity_type"2" deleted="0"/>
我越过了例外。
答案 4 :(得分:0)
我遇到了这个问题,原因是我的数据集文件的dtd有一个不同于我想要插入数据的表的描述。
因此,请检查您要插入数据的表与您的dtd文件具有相同的列。
当我在dtd文件中删除不在表中我插入数据的列时,问题就消失了。
答案 5 :(得分:0)
在我的情况下,它是一个以UTF-8编码的csv文件,开头有BOM char。我正在使用记事本来创建csv文件。使用notepade ++来避免保存BOM char。
答案 6 :(得分:0)
我遇到了同样的问题,然后发现我在我的数据库中使用了不同于我的XML文件中的列名。
我确定你在user_id与USER_ID中遇到问题。
答案 7 :(得分:0)
我只是偶然发现了这条错误消息。
我不得不扩展一段旧代码 - 我需要在几个表中添加一个新列。在我的一个实体中,我忘记为此列创建 setter 。因此,如果您的实体“完整”,您可以检查它们。
有时它可能就这么简单。
答案 8 :(得分:-1)
好的,我遇到了同样的麻烦,我找到了解决方案,我们创建测试数据的方式是错误的,对于我们使用的是什么类型的数据集,我们使用的xml数据集对于以下格式是正确的您正在使用FlatXmlDataSet,然后有不同的格式,有关更多说明,请参阅下面提供的链接。 xml应采用以下格式。
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<table>
<column>id</column>
<column>name</column>
<column>department</column>
<column>startDate</column>
<column>endDate</column>
<row>
<value>999</value>
<value>TEMP</value>
<value>TEMP DEPT</value>
<value>2113-10-13</value>
<value>2123-10-13</value>
</row>
</table>
</dataset>
如果您想了解更多信息,请访问此链接:http://dbunit.sourceforge.net/components.html