Hibernate:Doman模型到JPA实体/ DTO&合并()设计模式或最佳实践

时间:2012-06-20 15:56:37

标签: java hibernate

使用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会替换基于主键的元素吗?

任何帮助?

1 个答案:

答案 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()实现来查明该集合中是否已有对象。如果是这种情况,则不会添加,但会保留原始内容。