Hibernate SaveOrUpdate Ошибка / Другая ошибка с слиянием - PullRequest
0 голосов
/ 26 октября 2011

Hibernate Object:

Provider -> Он имеет отношение один ко многим с ProviderAddress и отношение один ко многим с ProviderStatusDetail

Ранее мы сохраняли / обновляли объект 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

Может кто-нибудь помочь мне в этом вопросе, пожалуйста.Надеюсь, мой вопрос понятен.Большое спасибо.

1 Ответ

0 голосов
/ 27 октября 2011

Решил проблему с помощью:

session.flush()
session.clear()

до последнего saveOrUpdate ().Удалено слияние ().

...