我将数据从 MS SQLServer 导出到 xml 文件,然后使用该数据集运行需要数据库的单元测试。我使用 dbunit maven 插件。
对我来说不幸的是,并非某些表中的所有列都映射到我的实体类中。
举个例子,我们有一个名为“member”的表。 成员(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 时排除(试图)添加该列?
最佳答案
在hibernate中实体的每个非静态非 transient 属性(取决于访问类型的字段或方法)都被认为是持久的,除非您将其注释为@Transient。
例如,
@Transient
public int counter; //transient property
private String firstname; //persistent property
注释为 @Transient 的方法和字段将被实体管理器忽略。参见 here了解更多信息。
关于java - 如何在使用 dbunit 插入 HSQLDB 期间排除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797170/