如何避免"具有相同ID的不同对象。"?

时间:2016-04-08 19:21:07

标签: java spring hibernate web

我正在使用:

  • Web App(过滤器打开会话.DAO使用getCurrentSession())
  • 休眠
  • Spring(服务上的AOP配置)
  • 所有
  • 的xml配置
  • Mbean与服务之间的DTO

嗯,我有两种方法(商业服务):

  • service.findUser(.. DTO ..)
  • service.updateUser(.. DTO ..)

update throws org.hibernate.NonUniqueObjectException异常。 我怎么能避免这种情况? 我需要使用更新,而不是合并。

提前致谢。

//MBean.java method
public void testUpdateUser(ActionEvent e) {
    System.out.println(name);
    ServiceResponse<UserDto> serviceResponse = super.getPrincipalService().findUser(name);
    UserDto userDto = serviceResponse.getResponseList().get(0);
//update some properties here
        serviceResponse = super.getPrincipalService().updateUser(userDto);
        LOG.info("" + serviceResponse);
}
    //Service.java: update method
    public ServiceResponse<UserDto> updateUser(UserDto userDto) {
        LOG.info("");
        ServiceResponse<UserDto> serviceResponse = new ServiceResponse<UserDto>();
        try {
            User user = this.getGlobalMapper().map(userDto, User.class);
            //
            this.getUserDao().update(user);
            userDto = this.getGlobalMapper().map(user, UserDto.class);
            serviceResponse.getResponseList().add(userDto);
            serviceResponse.setOperationCodeResponse(ServiceResponseCode.OK);
            serviceResponse.getMessages().add("Operacion OK");
        } catch (Exception e) {
            serviceResponse.getMessages().add(e.getMessage());
            serviceResponse.setOperationCodeResponse(ServiceResponseCode.MODEL_ERROR);
            LOG.error("", e);
        }
        return serviceResponse;
    }
    //Exception result
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.softlogia.copi.model.domain.User#155]
    at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:696)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:296)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:241)
    at org.hibernate.event.internal.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireUpdate(SessionImpl.java:705)
    at org.hibernate.internal.SessionImpl.update(SessionImpl.java:697)
    at org.hibernate.internal.SessionImpl.update(SessionImpl.java:693)

1 个答案:

答案 0 :(得分:0)

我假设你使用纯Hibernate作为ORM;简单地说,无论你的数据库的状态如何,你在当前的Hibernate会话中都有不同的同一行副本。要解决此问题,您可以:

1)flush()在db(插入或更新)上的每次写操作之后的hibernate会话

OR

2)在您的更新metod致电merge()而非saveOrUpdate()