Hibernate SaveOrUpdate 错误/合并时出现不同错误
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用以下方法解决了问题:
在最后一个 saveOrUpdate() 之前。删除了 merge()。
Solved the issue using:
before the last saveOrUpdate(). Removed merge().