DTO使用Java,Dozer和Hibernate映射和更新到数据库

时间:2011-03-29 14:29:21

标签: java hibernate dto dozer

我正在使用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");

最后,持久化角色的类会收到DTO并通过Dozer将其转换为Entity类以保留更改:

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

此时,我的角色实体已丢失其ID,可能是因为ID列被定义为自动增量,我显然无法更新null-ID实体。

那么我应该如何处理这个问题,以便ID和更新的字段全部映射到实体?我总是可以将实体对象与hibernate一起使用,并使用DTO中的每个字段更新它并将其保存回来,但它会破坏使用Dozer的全部目的。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

在这种情况下,为roleId实体上的Role提供setter是一种非常有效的方法。然后Dozer也会设置ID。 (另外,我假设Role上的字段并非真正公开。)

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

答案 1 :(得分: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类并在manager类中进行引用,你在哪里进行映射,并在GenericDao中更新你的Role类的更新方法你在哪里定义hibernate update方法调用它,你的工作就完成了。

答案 2 :(得分:0)

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

Role role = <entitymangaer>.find("id", Role.class);   
role = beanMapper.map(dto, role);
role.update();