Как исключить столбец во время INSERT с dbunit для HSQLDB - PullRequest
0 голосов
/ 10 января 2012

Я экспортирую данные из MS SQLServer в файл XML, а затем использую этот набор данных при выполнении модульных тестов, требующих базы данных. Для этого я использую плагин dbunit maven.

К сожалению для меня, не все столбцы в некоторых таблицах отображаются в моих классах сущностей.

В качестве примера, скажем, у нас есть таблица с именем '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?

Ответы [ 2 ]

1 голос
/ 10 января 2012

В спящем режиме каждое нестатическое непереходное свойство (поле или метод в зависимости от типа доступа) объекта считается постоянным, если вы не аннотируете его как @ Transient.

например,

@Transient
public int counter; //transient property

private String firstname; //persistent property

Методы и поля, помеченные как @Transient, будут игнорироваться менеджером объекта. См. здесь для получения дополнительной информации.

0 голосов
/ 25 декабря 2014

Может быть, этот ответ немного запоздал, но я столкнулся с подобной проблемой и написал следующий метод для ее решения (я использую 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 дает большую гибкость.

Интересно, есть ли более прямой способ сделать это?

...