4

我正在使用 Dozer 将 Hibernate 实体映射到它们的 DTO。一个简化的示例类如下:

@Entity
public class Role {

     @Id
     @GeneratedValue
     @Column(name="RoleId", nullable=false)
     public int roleId;

     @Column(name="RoleName", nullable=false)
     @NotEmpty
     public String roleName;

     //get + set  (not for the roleId since its autogenerated)
}

   public class RoleDTO {   

     private int roleId;
     private String roleName;

     public RoleDTO(int roleId, String roleName) {
          this.roleId = roleId;
          this.roleName = roleName;
     }

     public RoleDTO() {}

     //gets + sets
  }

现在映射工作正常,但我在尝试进行更新时遇到问题。假设我的数据库中有一个角色(1,“管理员”)。我的视图首先生成带有更新字段的 DTO:

RoleDTO roleDTO = new RoleDTO(1, "admin");

最终,持久化 Role 的类接收 DTO 并通过 Dozer 将其转换为 Entity 类以持久化更改:

Role role = DozerMapper.map(roleDTO,Role.class);    

此时,我的角色实体已经丢失了它的ID,大概是因为ID列被定义为自增,而我显然无法更新null-ID实体。

那么我应该如何解决这个问题,以便 ID 和更新的字段都映射到实体?我总是可以将实体对象带入休眠状态,并使用 DTO 中的字段更新其每个字段并将其保存回来,但这会破坏使用 Dozer 的全部目的。

谢谢你的帮助。

4

3 回答 3

6

在这种情况下,为您roleIdRole实体提供 setter 是一种非常有效的方法。然后推土机也将设置 ID。(另外,我假设您的领域Role并不是真正公开的。)

使用 Dozer,您可以从 DTO 创建一个实体。此时,实体被分离,即不与 Hibernate 会话相关联。然后,您应该使用session.merge(role)来持久化更改。

于 2011-03-31T01:12:28.593 回答
4
        @Autowired
        private RoleDao roleDao;

        @Transactional(readOnly = false)
        public void updateRole(RoleDTO roleDTO) {
            Role role = beanMapper.map(roleDTO, Role.class);
            roleDao.update(role);
        }   

您可以制作 Role Dao 类并在管理器类中进行引用,您在哪里进行映射并制作更新方法以更新您在 GenericDao 中的 Role 类,您在哪里定义了休眠更新方法调用它,您的工作就完成了。

于 2014-04-23T09:22:24.583 回答
0

您不必执行合并。Dozer 将允许您将更改应用到实体。

Role role = <entitymangaer>.find("id", Role.class);   
role = beanMapper.map(dto, role);
role.update();
于 2016-05-05T18:21:23.573 回答