1

使用 merge() 的推荐方法是在输入更改之前首先获取 DTO。

public void merge(PersonModel model) {

Person inputDTO = PersonBuilder.build(model)

Person dto = get(pk)
dto.setName(inputDTO.getName())

dto.getChildren().clear()

Iterator<Child> iter = inputDTO .getChildren().Iterator();

while(iter.hasNext()){
   dto.getChildren().add(iter.next());
}

dto.merge();

}

是否有一种更优雅的方式来执行将域模型转换为 dto 并合并它的操作,以免意外删除数据。

问题示例: 休眠:使用merge()时防止删除孤儿;

我发现需要清除列表并添加它非常浪费。

有人可以向我推荐一种设计模式或一种正确编码的方法吗?

谢谢

添加在:

1) 可以用 Hibernate Hashset 代替 List 吗?hibernate hashset 会根据主键替换元素吗?

有什么帮助吗?

4

1 回答 1

3

“使用 merge() 的推荐方法是在输入更改之前先获取 DTO”

谁建议你这样做?

“有没有更优雅的方式来执行这种将域模型转换为 dto 并合并它的操作,这样就不会意外删除任何数据。”

我认为您不能将域对象转换为 DTO。DTO 只是关于数据,域对象是数据、行为和上下文。完全不同。

如果您的域对象(也称为贫血域模型)中没有行为和上下文,则不需要仅复制对象的额外 DTO 层。

因为你用 Hibernate 标记了这个问题并在你的问题中提到了它,所以你不需要自己调用 merge,因为你刚刚从数据库中获取了对象,Hibernate 将刷新会话以将更改与数据库同步。

“可以用 Hibernate Hashset 代替 List 吗?hibernate hashset 会根据主键替换元素吗?”

我会用 Hashset 替换 List,因为要存储数据的表是一个集合,而不是一个列表(你不能有重复的记录)。哈希集不会根据主键替换元素。一个集合(任何集合,Hibernate 的实现也不例外)通过防止重复来工作。它使用您的 equals() 和 getHashCode() 实现来确定该集合中是否已经存在一个对象。如果是这种情况,则不会添加,但会保留原始内容。

于 2012-08-01T10:27:14.913 回答