0

我在尝试将业务和项目中的持久性分开时遇到了麻烦。骨架或多或少做了类似的事情:

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 是一个映射到数据库表的实体。
  • new UsuarioBO(dao)只是一个映射方法, 也是bo.bo2dao()一个映射方法,但是它创建了一个新的空实体Usuario。
  • 如您所见,在两种方法中创建的实体在方法完成时都会从内存中删除。

当我尝试这样做时,问题就出现了:

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

当我这样做时,休眠告诉我“存在具有相同标识符的现有实体”,这是真的!(它在 上创建一个实体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;
}

在这种情况下,RoleStatus也是连接的实体bean Usuario(一个用户只能有一个角色和一个状态)。

getRoleId()getStatusId()从名称中返回对应的 id(例如:"UNLOCKED"returns 1

4

0 回答 0