4

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を介してそれをエンティティクラスに変換します。

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

この時点で、おそらくID列が自動インクリメントとして定義されているために、ロールエンティティがIDを失い、nullIDエンティティを更新できないことは明らかです。

では、IDと更新されたフィールドがすべてエンティティにマップされるように、この問題にどのようにアプローチする必要がありますか?いつでもエンティティオブジェクトを休止状態にして、その各フィールドをDTOのフィールドで更新して保存し直すことはできますが、Dozerを使用する目的全体が無効になります。

助けてくれてありがとう。

4

3 に答える 3

6

この場合、エンティティにセッターを提供することは完全に有効なアプローチroleIdですRole。その後、ドーザーはIDも設定します。(また、あなたのフィールドRoleは実際には公開されていないと思います。)

Dozerを使用して、DTOからエンティティを作成します。その時点で、エンティティは切り離されます。つまり、Hibernateセッションに関連付けられません。次に、を使用session.merge(role)して変更を永続化する必要があります。

于 2011-03-31T01:12:28.593 に答える
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クラスを作成し、マッピングを行っているマネージャークラスで参照を作成し、GenericDaoでRoleクラスを更新するための更新メソッドを作成できます。ここで、休止状態の更新メソッドを呼び出して、作業を完了します。

于 2014-04-23T09:22:24.583 に答える
0

マージを実行する必要はありません。Dozerを使用すると、変更をエンティティに適用できます。

Role role = <entitymangaer>.find("id", Role.class);   
role = beanMapper.map(dto, role);
role.update();
于 2016-05-05T18:21:23.573 に答える