简体   繁体   English

如何避免“具有相同ID的其他对象。”?

[英]How to avoid “a different object with the same id..”?

I am using: 我在用:

  • Web App (a filter opens session. DAO uses getCurrentSession()) Web应用程序(过滤器打开会话。DAO使用getCurrentSession())
  • Hibernate 冬眠
  • Spring (AOP configuration over Service) 春季(通过服务进行AOP配置)
  • xml configuration for all 所有的xml配置
  • DTO between Mbean and Service Mbean和Service之间的DTO

Well, I have two methods (business service): 好吧,我有两种方法(业务服务):

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

update throws org.hibernate.NonUniqueObjectException exception. 更新引发org.hibernate.NonUniqueObjectException异常。 How can I avoid that? 我该如何避免呢? I need to use update, not merge. 我需要使用更新,而不是合并。

Thanks in advance. 提前致谢。

//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)

I am assuming you are using pure Hibernate as ORM; 我假设您使用纯Hibernate作为ORM; simply put, regardless of the status of your db, you have in your current Hibernate session different copies of the same row. 简而言之,不管数据库的状态如何,您在当前的Hibernate会话中都具有同一行的不同副本。 To resolve this you can: 要解决此问题,您可以:

1) flush() the hibernate session after every writing operation on db (insert or update) 1)在db上执行每次写入操作(插入或更新)后, flush()休眠会话

OR 要么

2) In your update metod call merge() instead of saveOrUpdate() 2)在更新方法中,调用merge()而不是saveOrUpdate()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM