hibernate实体生命周期

uujelgoq  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(243)

我在试图将业务和项目的持续性分开时遇到了麻烦。 backbone 或多或少有如下作用:

private UsuarioBO findById(String idUsuario) {
    Usuario dao = getUsuarioDao().findById(idUsuario);
    return new UsuarioBO(dao);
}

private void save(UsuarioBO bo){
    Usuario dao = bo.bo2dao();
    getUsuarioDao().save(dao);
}

关于上述代码的一些澄清:
usuariobo是业务对象,usuario是Map到db表的实体。
这个 new UsuarioBO(dao) 只是一个Map方法 bo.bo2dao() 也是一个Map方法,但它会创建一个新的空实体usuario。
如您所见,在两个方法中创建的实体在方法完成时都会从内存中删除。
当我尝试这样做时,问题是:

UsuarioBO example = findById("whatever");
save(example);

当我这么做的时候,hibernate告诉我“有一个具有相同标识符的实体”,这是真的(它正在创建一个实体 findById() 另一个在 save() ).
我找到的唯一解决方案是将实体用作“bo”。我的意思是,把实体对象带到服务中,直接对实体做任何修改,当我完成保存时,尽管有一个bo,还是发送实体。
我很确定有更好的办法,但是怎么做呢?
编辑:这是 save(dao) 方法:

public void save(Usuario usuario) throws Exception {
    try {
        getSession().saveOrUpdate(usuario);

    } catch (RuntimeException e) {
            //error treatment
    throw e;
    }
}

这就是 bo2dao() 方法(它在bo bean中):

public Usuario bo2dao() throws Exception {

    Usuario dao = new Usuario();

    try {

        dao.setId(this.id);
        dao.setPassword(this.password);
        //other similar fields...
        dao.setLastLoginTime(this.lastLoginTime);

        Role r = new Role();
        r.setId(LoginHelper.getRoleId(this.role.getName()));
        dao.setRole(r);

        Status s = new Status();
        s.setId(LoginHelper.getStatusId(this.status.getName()));
        dao.setStatus(s);

    } catch (Exception e) {

        throw e;
    }

    return dao;
}

在这种情况下, Role 以及 Status 实体bean也与 Usuario (一个用户只能有一个角色和一个状态)。 getRoleId() 以及 getStatusId() 从名称返回相应的id(例如: "UNLOCKED" 退货 1 )

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题