簡體   English   中英

DTO使用Java,Dozer和Hibernate映射和更新到數據庫

[英]DTO mapping and updating to a Database with Java, Dozer and Hibernate

我正在使用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的整個目的。

謝謝你的幫助。

在這種情況下,為Role實體上的roleId提供setter是一種非常有效的方法。 然后Dozer也會設置ID。 (另外,我假設你在Role上的字段不是真的公開。)

使用Dozer,您可以從DTO創建實體。 此時,實體被分離,即與Hibernate會話無關。 然后,您應該使用session.merge(role)來保留更改。

        @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類的更新方法,您在其中定義了hibernate update方法,並且您的工作已完成。

您不必執行合並。 Dozer將允許您將更改應用於實體。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM