我将数据从MS SQLServer导出到xml文件,然后在运行需要数据库的单元测试中使用该数据集。我使用dbunit maven插件。
不幸的是,对于我来说,并非某些表中的所有列都映射到我的Entity类中。
例如,我们有一个名为'member'的表。 成员表有三列:memberid,membername,memberrank。 当我进行导出时,我会导出所有三列。 但是在我的MemberEntity类中,我只映射了memberid和membername,因为我的应用程序中不需要memberrank。所以我会让MemberEntity看起来像这样:
@Entity
@Table(name = "member")
public class MemberEntity {
@Id
@GeneratedValue()
@Column(name = "memberid", nullable = false)
private Integer memberid;
@Column(name = "membername", nullable = false)
private String membername;
...
}
然后,我尝试在测试用例之前将数据集插入HSQLDB:
IDatabaseConnection conn = new DatabaseConnection(((SessionImpl) (entityManager.getDelegate())).connection());
IDataSet dataset = new XmlDataSet(
resourceLoader.getResource("classpath:dataset.xml").getInputStream());
conn.getConfig().setProperty("http://www.dbunit.org/properties/datatypeFactory", new MsSqlDataTypeFactory());
DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);
此时,我得到一个例外,即MemberRank列不存在。它说的如下:
org.dbunit.dataset.NoSuchColumnException: MEMBER.MEMBERRANK - (Non-uppercase input column: memberrank) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
当我从数据集中删除列时,一切都很好。如果我将memberRank映射添加到我的Entity类中,那么一切顺利。 但是我无法将列映射添加到我的Entity类中。是否有一种简单的方法(除了从导出的数据集中手动删除列和相关数据),以便在我执行INSERT时将该列排除(尝试添加)?
答案 0 :(得分:1)
在hibernate 中,实体的每个非静态非瞬态属性(字段或方法取决于访问类型)都被视为持久性,除非您将其注释为@Transient。
例如,
@Transient
public int counter; //transient property
private String firstname; //persistent property
实体管理员将忽略注释为@Transient的方法和字段。有关详细信息,请参阅here。
答案 1 :(得分:0)
也许这个答案有点迟了,但我遇到了类似的问题,并编写了以下方法来解决它(我使用的是dbUnit 2.5.0)。希望它对某人有所帮助。
/**
* Generates a new data set with the columns declared in the
* "excludedColumns" map removed.
*
* @param src
* Source data set.
* @param excludedColumns
* Map of table names and column names. Columns in this map are
* removed in the resulting data set.
* @return Data set with the columns declared in the "excludedColumns" map
* removed. Tables that are not specified in the "excludedColumns"
* map are left untouched.
* @throws DataSetException
*/
public static IDataSet filterDataSet(IDataSet src,
Map<String, Set<String>> excludedColumns) throws DataSetException {
if (excludedColumns == null) {
return src;
}
ArrayList<ITable> tables = new ArrayList<ITable>(
src.getTableNames().length);
for (String tableName : src.getTableNames()) {
if (excludedColumns.containsKey(tableName)) {
ITable filteredTable = DefaultColumnFilter
.excludedColumnsTable(
src.getTable(tableName),
excludedColumns.get(tableName).toArray(
new String[0]));
tables.add(filteredTable);
} else {
tables.add(src.getTable(tableName));
}
}
return new DefaultDataSet(tables.toArray(new ITable[0]),
src.isCaseSensitiveTableNames());
}
该方法的核心是DefaultColumnFilter
。我在这里使用商品静态方法,但DefaultColumnFilter
的实例提供了很大的灵活性。
我想知道是否有更直接的方式来做这件事。