java - Hibernate: Doman Model to JPA Entity/DTO & Merge() 设计模式或最佳实践

标签 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();

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

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

谢谢

添加:

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

有什么帮助吗?

最佳答案

"The recommended way of using merge() is to first get the DTO first before inputting the changes"

谁推荐你这样做的?

"Is there a more elegant way of performing such operation translating domain model to dto and merging it so that no data are accidentally deleted."

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

如果您的域对象 (a.k.a. anemic domain model) 中没有行为和上下文,则不需要额外的 DTO 层来复制对象。

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

"Possible to use Hibernate Hashset to replace List? Will hibernate hashset replace elements base on primary keys?"

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

关于java - Hibernate: Doman Model to JPA Entity/DTO & Merge() 设计模式或最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123446/

相关文章:

java - 如何使用 lombok 注释从 jpa 实体注释获取字段值?

java - 如何为 CollectionOfElements 创建自定义查询

java - SessionFactory Hibernate 错误(Spring MVC 项目)

java - 写入 Oracle 时使用 java.util.Date 时区问题

java - 屏幕锁定时我无法接收通知

java - 按住按钮时对多个节点进行 MouseDragged 检测 JavaFX

java - scrollPathToVisible 行为不正常

java - 名称的冲突持久性单元定义

java - keytool -genkeypair + keytool -list + jarsigner -verify ==>java 1.8 win 10 中的ZipException

java - 模拟静态方法链