java - DbUnit 和递归实体

标签 java hibernate one-to-many dbunit

我有一个 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 按预期工作。看起来递归实体有一些问题。

最佳答案

问题是,DbUnit 仅考虑 Flat XML 数据集中第一次出现表标记的列名称。因此以下标记中的“父”列被忽略。

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

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

关于java - DbUnit 和递归实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826927/

相关文章:

java - 如何在以下代码中根据我的喜好设置 JTextArea 和 JTextField 的大小?

java - java逆向工程工具

java - Hibernate映射内部类,错误 "Could not determine type for: timeStamps"

Hibernate检测转换失败: cannot find class (HHH000373)

Grails:GORM 多对多和一对多关系映射

java - 回收器 View 无法正常工作,没有任何错误

java - 如何防止 JPA 插入锁定数据库表?

java - Hibernate、OneToMany 关联 - 选择问题

c# - Entity Framework 5 Code First 中的一对一和一对多关系

java - 按键不起作用