使用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并将其合并,以便不会意外删除任何数据。
问题示例: Hibernate: prevent delete orphan when using merge();
我发现需要清除列表并添加它非常浪费。
有人可以向我推荐一种设计模式或正确编码方式吗?
谢谢
ADD ON:
1)可以使用Hibernate Hashset替换List吗? hibernate hashset会替换基于主键的元素吗?
任何帮助?
答案 0 :(得分:3)
“使用merge()的推荐方法是在输入更改之前首先获取DTO”
谁建议你这样做?
“是否有一种更优雅的方式来执行此类操作,将域模型转换为dto并合并它,以便不会意外删除任何数据。”
我认为您不能将域对象转换为DTO。 DTO只是数据,域对象是数据,行为和上下文。完全不同。
如果您的域对象(a.k.a. anemic domain model)中没有行为和上下文,则不需要额外的DTO图层来复制对象。
因为你用Hibernate标记了这个问题并在你的问题中提到过,你不需要自己调用merge,因为你刚从数据库中获取了对象,而Hibernate将刷新会话以使更改与数据库同步。 / p>
“可以使用Hibernate Hashset替换List吗?hibernate hashset会基于主键替换元素吗?”
我会用一个Hashset替换List,因为要存储数据的表是一个集合,而不是一个列表(你不能有重复的记录)。哈希集不会替换基于主键的元素。一个集合(任何集合,Hibernate的实现都没有区别)通过防止重复来工作。它使用你的equals()和getHashCode()实现来查明该集合中是否已有对象。如果是这种情况,则不会添加,但会保留原始内容。