2012-01-10 47 views
0

我將數據從MS SQLServer導出到xml文件,然後在運行需要數據庫的單元測試中使用該數據集。我使用dbunit maven插件。如何在使用dbunit插入期間將列排除到HSQLDB

對我來說不幸的是,並不是所有表中的所有列都映射到我的實體類中。例如,我們有一個名爲'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映射添加到我的實體類中,則一切順利。 但我無法將列映射添加到我的實體類中。是否有一種簡單的方法(除了手動從導出的數據集中刪除列和關聯的數據)排除該列時(我試圖添加)在執行INSERT時?

+0

是您的問題解決了嗎?我看不到任何評論或接受的答案。 – ManuPK 2012-01-18 15:02:01

回答

1

在休眠實體的每個非靜態非瞬態屬性(取決於訪問類型的字段或方法)被視爲持久化,除非您將其註釋爲@Transient。

例如,

@Transient 
public int counter; //transient property 

private String firstname; //persistent property 

的方法和註釋爲@Transient字段將由實體manager.See here以獲取更多信息被忽略。

+1

這不是我正在尋找的東西。我曾經想過讓DBUnit忽略某些列,而不修改我的實體類。儘管如此,我最終還是在實體類中添加了這些列。 – 2012-01-18 22:28:30

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的實例給出了很大的靈活性。

我不知道是否有更直接的方式來做到這一點。