我正在使用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的全部目的。
感谢您的帮助。
答案 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();