Hibernate SaveOrUpdate 错误/合并时出现不同错误

发布于 2024-12-12 08:14:52 字数 2870 浏览 6 评论 0原文

Hibernate 对象:

提供者 -->它与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

有人可以帮助我解决此问题吗?希望我的问题很清楚。非常感谢。

Hibernate Object:

Provider --> It has one to many relationship with ProviderAddress
and one to many relationship with ProviderStatusDetail

Earlier we were saving/updating the Provider Object to the database. Everything was working fine. Now we have to save the old values to a History table and then save/update the Provider Table.

Portions of the Code:

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);
    }
} 

Error 1:
This line used to work fine before the History table changes. Now I get this error:

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

Error 2:

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

Can some one help me on this issue please. Hope my question is clear. Thanks so much.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盗梦空间 2024-12-19 08:14:52

使用以下方法解决了问题:

session.flush()
session.clear()

在最后一个 saveOrUpdate() 之前。删除了 merge()。

Solved the issue using:

session.flush()
session.clear()

before the last saveOrUpdate(). Removed merge().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文