End*_*ndo 4 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)
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
现在映射工作正常,但我在尝试进行更新时遇到问题.假设我的数据库中有一个角色(1,"管理员").我的视图首先使用更新的字段生成DTO:
RoleDTO roleDTO = new RoleDTO(1, "admin");
Run Code Online (Sandbox Code Playgroud)
最终,持久化角色的类接收DTO并通过Dozer将其转换为Entity类以保留更改:
Role role = DozerMapper.map(roleDTO,Role.class);
Run Code Online (Sandbox Code Playgroud)
此时,我的角色实体已丢失其ID,可能是因为ID列被定义为自动增量,我显然无法更新null-ID实体.
那么我应该如何处理这个问题,以便ID和更新的字段全部映射到实体?我总是可以使用hibernate来实现实体对象,并使用DTO中的每个字段更新它们并将其保存回来,但它会破坏使用Dozer的整个目的.
谢谢你的帮助.
在这种情况下,为您roleId的Role实体提供setter是一种非常有效的方法.然后Dozer也会设置ID.(另外,我假设您的字段Role不是真的公开.)
使用Dozer,您可以从DTO创建实体.此时,实体被分离,即与Hibernate会话无关.然后,您应该使用它session.merge(role)来保留更改.
| 归档时间: |
|
| 查看次数: |
7331 次 |
| 最近记录: |