gpt4 book ai didi

java - 使用 Java、Dozer 和 Hibernate 将 DTO 映射和更新到数据库

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:39 24 4
gpt4 key购买 nike

我正在使用 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,"Administrator")。我的 View 首先生成具有更新字段的 DTO:

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

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

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

此时,我的角色实体已经失去了它的ID,大概是因为ID列被定义为自增,而我显然不能更新空ID实体。

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

感谢您的帮助。

最佳答案

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

使用 Dozer,您可以从 DTO 创建一个实体。那时,实体是分离的,即不与 Hibernate session 关联。然后,您应该使用 session.merge(role) 来保存更改。

关于java - 使用 Java、Dozer 和 Hibernate 将 DTO 映射和更新到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com