Java 如何在向HSQLDB插入dbunit时排除列

Java 如何在向HSQLDB插入dbunit时排除列,java,hibernate,unit-testing,hsqldb,dbunit,Java,Hibernate,Unit Testing,Hsqldb,Dbunit,我将数据从MSSQLServer导出到xml文件,然后在运行需要数据库的单元测试时使用该数据集。我使用dbunitmaven插件 不幸的是,并非某些表中的所有列都映射到实体类中 例如,我们有一个名为“member”的表。 成员表有三列:memberid、membername、memberrank。 当我进行导出时,我会导出所有三列。 但在我的MemberEntity类中,我只映射memberid和membername,因为我的应用程序中不需要memberrank。所以我会让MemberEntit

我将数据从MSSQLServer导出到xml文件,然后在运行需要数据库的单元测试时使用该数据集。我使用dbunitmaven插件

不幸的是,并非某些表中的所有列都映射到实体类中

例如,我们有一个名为“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;
...
}
然后,我尝试在测试用例之前将dataset插入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映射添加到我的实体类中,一切都会顺利进行。
但我无法将列映射添加到实体类中。是否有一种简单的方法(除了手动从导出的数据集中删除列和相关数据)可以在我插入时排除(试图)添加该列?

在hibernate中,实体的每个非静态非瞬态属性(字段或方法,取决于访问类型)都被视为持久属性,除非您将其注释为@Transient。

比如说,

@Transient
public int counter; //transient property

private String firstname; //persistent property

实体管理器将忽略注释为@Transient的方法和字段。有关更多信息,请参阅。

也许这个答案来得有点晚,但我刚刚遇到了一个类似的问题,并编写了以下方法来解决它(我使用的是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());
}
/**
*生成一个新的数据集,其中列在
*“excludedColumns”映射已删除。
* 
*@param src
*源数据集。
*@param excludedColumns
*表名和列名的映射。此地图中的列是
*在结果数据集中删除。
*@返回“excludedColumns”映射中声明的列的数据集
*删除。“excludedColumns”中未指定的表
*地图保持不变。
*@DataSetException
*/
公共静态IDataSet过滤器数据集(IDataSet src,
映射excludedColumns)引发DataSetException{
if(excludedColumns==null){
返回src;
}
ArrayList tables=新的ArrayList(
src.getTableNames().length);
for(字符串tableName:src.getTableNames()){
if(不包括列containsKey(表名)){
ITable filteredTable=DefaultColumnFilter
.excludedColumnsTable(
src.getTable(表名),
excludedColumns.get(tableName).toArray(
新字符串[0]);
表。添加(可过滤);
}否则{
tables.add(src.getTable(tableName));
}
}
返回新的DefaultDataSet(tables.toArray(新的ITable[0]),
src.isCaseSensitiveTableNames());
}
该方法的核心是
DefaultColumnFilter
。这里我使用的是商品静态方法,但是
DefaultColumnFilter
的一个实例提供了很大的灵活性


我想知道是否有更直接的方法来解决这个问题。

您的问题解决了吗?我看不到任何评论或接受的答案。这不是我想要的。我在寻找一种方法,使DBUnit忽略某些列,而不修改实体类。不过,我最终还是在实体类中添加了这些列。