【问题标题】:DbUnit and recursive entityDbUnit 和递归实体
【发布时间】:2014-11-09 19:18:42
【问题描述】:

我有一个与其自身(父子)具有递归关系的 Hibernate 实体。我使用 DbUnit XML 文件在我的测试中插入一些数据,包括关系。

但是,在我正在测试的服务中查询 parent=null(根)列表时,我也将 XML 中指定的子代作为根(也有 parent=null)。

为什么会这样?

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames={"parent", "name"}))
public class Entity {

    @Id
    @Column(name = "id", unique = true)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "parent")
    private Entity parent;

    @OneToMany(mappedBy = "parent")
    private List<Entity> children;

}

以及 XML 数据集文件:

<dataset>
    <entity id="1" name="root1" />
    <entity id="2" name="root2" />
    <entity id="3" name="child" parent="2"/>
</dataset>

在列出根时,我还会得到父属性为 null 的“子”实体。

如果我使用实体实例创建关系并将它们持久化,它就可以工作。

此外,我还有另一个实体与不同实体具有多对一关系(无递归),这使用 DbUnit 数据集 XML 可以按预期工作。似乎递归实体有一些问题。

【问题讨论】:

    标签: java hibernate one-to-many dbunit


    【解决方案1】:

    问题在于,DbUnit 只考虑 Flat XML 数据集中第一次出现 table 标记的列名。因此,以下标签中的“父”列被忽略了。

    但是,由于我需要先插入根文件夹,因此我需要将“父”列设为空。但是在 Flat XML 数据集中,空值是通过省略列来处理的,这与前面的说法相反。

    解决方案是不使用Flat XML数据集,而是使用普通且更详细的Xml DataSet,它提供可用于空值列的标记。

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多