【问题标题】:How to avoid "a different object with the same id.."?如何避免“具有相同 id 的不同对象..”?
【发布时间】:2016-04-09 05:25:33
【问题描述】:

我正在使用:

  • Web 应用(过滤器打开会话。DAO 使用 getCurrentSession())
  • 休眠
  • Spring(基于服务的 AOP 配置)
  • 所有的xml配置
  • Mbean 和服务之间的 DTO

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

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

更新抛出 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)

【问题讨论】:

  • 您需要进一步缩小问题范围,并发布出错或您不理解的代码的 sn-p。

标签: java spring hibernate web


【解决方案1】:

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

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

2) 在您的更新方法中调用merge() 而不是saveOrUpdate()

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2016-11-21
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多