java - UnsupportedOperationException when merging an existing Hibernate model object? -
after upgrade hibernate 3 4, we're working through few kinks popped along way. 1 has particularly stumped unsupportedoperationexception, existing object pulled database, tweaked, , merged.
the problem hibernate appears adding object abstractlist
this seems happen 1 particular object type, when saved in our dao, best can tell:
- we're not using sublist() or aslist() methods cause immutable instance created.
- examining object that's being saved (which enormous , has many children) don't think of children items
abstractlisttypes.
here code snippets around stack points:
hibernatedao.save():
@transactional public void save(t item) { try { getsessionfactory().getcurrentsession().merge(item); } catch (exception ex) { logger.debug("unable merge", ex); logger.warn("unable merge item, saving instead. (of type " + item.getclass() + ")"); getsessionfactory().getcurrentsession().saveorupdate(item); } } our user item, being saved, has number of children items defined so:
@onetomany(cascade = cascadetype.all) @lazycollection(lazycollectionoption.false) private map<string, project> associatedprojects = new hashmap<string, project>(); the project class has other similarly-annotated children, has cascadetype.all, , lazycollectionoption.false defined.
here (quite tall) stack trace:
note our code begins com.company.application
06/04 18:15:45 debug [thread-19258] hibernate.hibernatedao.save- unable merge java.lang.unsupportedoperationexception @ java.util.abstractlist.add(abstractlist.java:148) @ java.util.abstractlist.add(abstractlist.java:108) @ org.hibernate.collection.internal.persistentbag.add(persistentbag.java:292) @ org.hibernate.type.collectiontype.replaceelements(collectiontype.java:496) @ org.hibernate.type.collectiontype.replace(collectiontype.java:563) @ org.hibernate.type.abstracttype.replace(abstracttype.java:178) @ org.hibernate.type.typehelper.replaceassociations(typehelper.java:261) @ org.hibernate.event.internal.defaultmergeeventlistener.copyvalues(defaultmergeeventlistener.java:398) @ org.hibernate.event.internal.defaultmergeeventlistener.entityistransient(defaultmergeeventlistener.java:221) @ org.hibernate.event.internal.defaultmergeeventlistener.entityisdetached(defaultmergeeventlistener.java:282) @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:151) @ org.hibernate.internal.sessionimpl.firemerge(sessionimpl.java:914) @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:896) @ org.hibernate.engine.spi.cascadingaction$6.cascade(cascadingaction.java:288) @ org.hibernate.engine.internal.cascade.cascadetoone(cascade.java:380) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:323) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascadecollectionelements(cascade.java:409) @ org.hibernate.engine.internal.cascade.cascadecollection(cascade.java:350) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:326) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascade(cascade.java:165) @ org.hibernate.event.internal.defaultmergeeventlistener.cascadeonmerge(defaultmergeeventlistener.java:439) @ org.hibernate.event.internal.defaultmergeeventlistener.entityisdetached(defaultmergeeventlistener.java:308) @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:151) @ org.hibernate.internal.sessionimpl.firemerge(sessionimpl.java:914) @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:896) @ org.hibernate.engine.spi.cascadingaction$6.cascade(cascadingaction.java:288) @ org.hibernate.engine.internal.cascade.cascadetoone(cascade.java:380) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:323) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascadecollectionelements(cascade.java:409) @ org.hibernate.engine.internal.cascade.cascadecollection(cascade.java:350) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:326) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascade(cascade.java:165) @ org.hibernate.event.internal.defaultmergeeventlistener.cascadeonmerge(defaultmergeeventlistener.java:439) @ org.hibernate.event.internal.defaultmergeeventlistener.entityisdetached(defaultmergeeventlistener.java:308) @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:151) @ org.hibernate.internal.sessionimpl.firemerge(sessionimpl.java:914) @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:896) @ org.hibernate.engine.spi.cascadingaction$6.cascade(cascadingaction.java:288) @ org.hibernate.engine.internal.cascade.cascadetoone(cascade.java:380) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:323) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascadecollectionelements(cascade.java:409) @ org.hibernate.engine.internal.cascade.cascadecollection(cascade.java:350) @ org.hibernate.engine.internal.cascade.cascadeassociation(cascade.java:326) @ org.hibernate.engine.internal.cascade.cascadeproperty(cascade.java:208) @ org.hibernate.engine.internal.cascade.cascade(cascade.java:165) @ org.hibernate.event.internal.defaultmergeeventlistener.cascadeonmerge(defaultmergeeventlistener.java:439) @ org.hibernate.event.internal.defaultmergeeventlistener.entityisdetached(defaultmergeeventlistener.java:308) @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:151) @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:76) @ org.hibernate.internal.sessionimpl.firemerge(sessionimpl.java:904) @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:888) @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:892) @ com.company.hibernate.hibernatedao.save(hibernatedao.java:129) @ sun.reflect.generatedmethodaccessor62.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ org.springframework.aop.support.aoputils.invokejoinpointusingreflection(aoputils.java:318) @ org.springframework.aop.framework.reflectivemethodinvocation.invokejoinpoint(reflectivemethodinvocation.java:183) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:150) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:106) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:172) @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:202) @ $proxy53.save(unknown source) @ com.company.application.usermanager.save(usermanager.java:46) @ sun.reflect.generatedmethodaccessor67.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ org.springframework.aop.support.aoputils.invokejoinpointusingreflection(aoputils.java:318) @ org.springframework.aop.framework.reflectivemethodinvocation.invokejoinpoint(reflectivemethodinvocation.java:183) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:150) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:106) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:172) @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:202) @ $proxy66.save(unknown source) @ com.company.application.useroperationcontroller.saveuser(useroperationcontroller.java:533) we're not sure abstractlist coming from, or how we're responsible. there potential pitfalls when working hibernate 4 (this issue new since upgrade) result in partially-unmodifiable objects? or cause hibernate act in way results in attempting create unmodifiable instances of objects?
@onetomany(cascade = cascadetype.all) @lazycollection(lazycollectionoption.false) private map associatedprojects = new hashmap();
how add this.
@onetomany(cascade = cascadetype.all)
*@joincolumn(name="")*
@lazycollection(lazycollectionoption.false) private map associatedprojects = new hashmap();
Comments
Post a Comment