Java 休眠实体生命周期

Java 休眠实体生命周期,java,hibernate,entity,lifecycle,Java,Hibernate,Entity,Lifecycle,我在试图将业务与项目的持续性分开时遇到了麻烦。 骨架的作用大致类似于: private UsuarioBO findById(String idUsuario) { Usuario dao = getUsuarioDao().findById(idUsuario); return new UsuarioBO(dao); } private void save(UsuarioBO bo){ Usuario dao = bo.bo2dao(); getUsuario

我在试图将业务与项目的持续性分开时遇到了麻烦。 骨架的作用大致类似于:

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);
}
关于上述代码的一些澄清:

  • Usuario是一个业务对象,Usuario是一个映射到DB的实体 桌子
  • 新的UsuarioBO(dao)只是一种映射方法,而
    bo.bo2dao()
    也是一种映射方法,但它会创建一个新的空实体 乌萨里奥
  • 如您所见,在两个方法中创建的实体在方法完成时都会被擦除内存
当我尝试这样做时,问题是:

UsuarioBO example = findById("whatever");
save(example);
当我这样做时,hibernate告诉我“有一个具有相同标识符的现有实体”,这是真的!(它在
findById()
上创建一个实体,在
save()
上创建另一个实体)

我找到的唯一解决方案是将实体用作“bo”。我的意思是,将实体对象带到服务中,直接对实体进行任何修改,当我完成保存操作时,不顾BO发送实体

我很确定有更好的方法,但是怎么做呢

编辑: 这是
保存(dao)
方法:

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

    } catch (RuntimeException e) {
            //error treatment
    throw e;
    }
}
这是
bo2dao()
方法(它在bobean中):

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


getRoleId()
getStatusId()
从名称中返回相应的id(例如:
“UNLOCKED”
返回
1

Hibernate告诉您存在一个与错误消息或警告/信息/调试消息具有相同标识符的现有实体?此调用的是什么Hibernate方法.save(dao)?如果它正在调用
save()
,那么它应该是
update()
(或者
saveOrUpdate()
)。因为您没有插入新记录,所以实际上是在检索现有记录并对其进行更新。如果您尝试使用
save()
方法执行此操作,hibernate将抛出您提到的错误。@Luiggi Mendoza它将我作为错误发送,并且应用程序崩溃…@Bhesh Gurung调用saveOrUpdate()。我将用这些信息编辑第一篇文章。如果不是这样的话,那么它可能是-
Usuario dao=bo.bo2dao()
,它可能正在创建一个新实例,但在这个过程中也会将id从旧实例复制到新实例。您能否准确地显示它是如何创建和返回新实例的?
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;
}