2016-04-08 16 views
0

私が使用しています:「同じIDを持つ別のオブジェクト..」を避けるにはどうすればよいですか?

  • Web Appでは、(フィルタが開き、セッションDAOはgetCurrentSession()を使用しています。)
  • 休止
  • 春(サービスオーバーAOPの設定)すべて
  • ため
  • XML設定をMbeanとサービス間のDTO

私は2つの方法(ビジネスサービス)を持っています:

  • 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) 
+0

のあなたの更新metodコールでDB上のすべての書き込み操作(挿入または更新)

OR

2)の後

1)flush() Hibernateセッションあなたはもう少し問題を絞って、間違っているか分からないコードのスニペットを投稿する必要があります。 – rghome

答えて

0

純粋なHibernateをORMとして使用していると仮定しています。単純に、dbの状態にかかわらず、現在のHibernateセッションで同じ行の異なるコピーを持っています。これを解決するには、次のことができます。merge()代わりsaveOrUpdate()

関連する問題