2011-10-26 4 views
0

Hibernateのオブジェクトでエラー/別のエラー:休止するsaveOrUpdateマージ

プロバイダは - >これは、以前の私たちがプロバイダを更新/保存されたProviderStatusDetail

と多くの関係ProviderAddress と1との一対多の関係を持っていますオブジェクトをデータベースに追加します。すべてがうまくいきました。これで古い値をHistoryテーブルに保存し、次にProviderテーブルを保存/更新する必要があります。コードの

一部:

public void saveProvider(Provider provider) { 

    //Get Existing Data from Provider 
    Provider existingProvider = (Provider) this.getHibernateTemplate().get(Provider.class, provider.getProviderId()); 

    ProviderHistory providerHistory = null; 
    providerHistory = new ProviderHistory(); 

    providerHistory.setProviderId(existingProvider.getProviderId()); 
    ... 

    //Get Existing Data from Provider Status Detail 
    ProviderStatusDetail existingProviderStatusDetail = (ProviderStatusDetail) this.getHibernateTemplate().get(ProviderStatusDetail.class,    

     existingProvider.getProviderStatusDetails().get(0).getProviderStatusDetailId()); 

    providerHistory.setTypeCode(existingProviderStatusDetail.getTypeCode()); 
    ... 

    // Save Provider History Table 
    this.getHibernateTemplate().save(providerHistory); 

    // Get Existing Address Details 
    Address address1 = this.getHibernateTemplate().get(Address.class, 
          existingProvider.getAddresses().get(0).getAddressId()); 

    // Save exsiting Practice Address to Address History Table 
    ProviderAddressHistory practiceAdrHistory = null; 
    adrHistory = new ProviderAddressHistory(); 

    adrHistory.setProviderId(provider.getProviderId()); 
    ... 

    this.getHibernateTemplate().save(practiceAdrHistory); 

    //Make some changes to the Status Detail Object 
    for (ProviderStatusDetail psd : provider.getProviderStatusDetails()) { 

      //Provider Type check 
      if (psd.getTypeCode() != null 
        && psd.getTypeCode() == 0) { 
       psd.setTypeCode(null); 
      } 
    ... 
    } 

    //Make sonme changes to Provider Object 
    if (provider != null) { 
      if (provider.getName() != null) { 
       if (provider.getName().getPrefix() == 0) { 
        provider.getName().setPrefix(null); 
       } 
    } 


    //Save Provider 
    //this.getHibernateTemplate().saveOrUpdate(provider); //Error 1 - So commented this line 

    //Save Provider with merge 
    if (provider.getProviderId() > 0) { 
      this.getHibernateTemplate().merge(provider); //Error 2 
    } else { 
      this.getHibernateTemplate().saveOrUpdate(provider); 
    } 
} 

エラー1:履歴テーブルが変更される前に正常に動作するために使用 このライン。今、私はこのエラーを取得する:

A different object with the same identifier value was already associated with the session. 

はエラー2:

Caused by: org.hibernate.TransientObjectException: object is an unsaved transient instance - save the transient instance before merging: com.abcd.ProviderStatusDetail 

いくつかのいずれかがこの問題で私を助けてくださいことができます。私の質問ははっきりしていると思う。本当にありがとう。 )(

session.flush() 
session.clear() 

を最後にするsaveOrUpdate前:

答えて

0

は、使用して問題を解決しました。 merge()を削除しました。