java - Hibernate throw TransientObjectException when I pass a transient object as parameter for a query after I implement the optimist locking -


i working in project hibernate entity manager, , nice until start implement optimistic lock in our entities.

for example, have following named query returns addresses of person:

@namedquery(name = "address.findbyperson", query = "select address a.person = :person") 

in order pass person object query, did this:

person nperson = new person(); nperson.setid(1);  typedquery<address> query = manager.createnamedquery("address.findbyperson", address.class); query.setparameter("person", nperson); query.getresultlist(); 

it fine until introduce @version inside person entity. after that, follow exception start occurs:

java.lang.reflect.invocationtargetexception     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:497)     @ com.sun.javafx.application.launcherimpl.launchapplicationwithargs(launcherimpl.java:389)     @ com.sun.javafx.application.launcherimpl.launchapplication(launcherimpl.java:328)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:497)     @ sun.launcher.launcherhelper$fxhelper.main(launcherhelper.java:767) caused by: java.lang.illegalstateexception: org.hibernate.transientobjectexception: object references unsaved transient instance - save transient instance before flushing: com.sandboxmaven.entity.person     @ org.hibernate.jpa.spi.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1760)     @ org.hibernate.jpa.spi.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1677)     @ org.hibernate.jpa.internal.queryimpl.getresultlist(queryimpl.java:458)     @ com.sandboxmaven.main.sandbox.main(sandbox.java:52)     ... 11 more caused by: org.hibernate.transientobjectexception: object references unsaved transient instance - save transient instance before flushing: com.sandboxmaven.entity.person     @ org.hibernate.engine.internal.foreignkeys.getentityidentifierifnotunsaved(foreignkeys.java:294)     @ org.hibernate.type.entitytype.getidentifier(entitytype.java:510)     @ org.hibernate.type.manytoonetype.nullsafeset(manytoonetype.java:174)     @ org.hibernate.param.namedparameterspecification.bind(namedparameterspecification.java:67)     @ org.hibernate.loader.hql.queryloader.bindparametervalues(queryloader.java:613)     @ org.hibernate.loader.loader.preparequerystatement(loader.java:1900)     @ org.hibernate.loader.loader.executequerystatement(loader.java:1861)     @ org.hibernate.loader.loader.executequerystatement(loader.java:1838)     @ org.hibernate.loader.loader.doquery(loader.java:909)     @ org.hibernate.loader.loader.doqueryandinitializenonlazycollections(loader.java:354)     @ org.hibernate.loader.loader.dolist(loader.java:2551)     @ org.hibernate.loader.loader.dolist(loader.java:2537)     @ org.hibernate.loader.loader.listignorequerycache(loader.java:2367)     @ org.hibernate.loader.loader.list(loader.java:2362)     @ org.hibernate.loader.hql.queryloader.list(queryloader.java:496)     @ org.hibernate.hql.internal.ast.querytranslatorimpl.list(querytranslatorimpl.java:387)     @ org.hibernate.engine.query.spi.hqlqueryplan.performlist(hqlqueryplan.java:229)     @ org.hibernate.internal.sessionimpl.list(sessionimpl.java:1260)     @ org.hibernate.internal.queryimpl.list(queryimpl.java:103)     @ org.hibernate.jpa.internal.queryimpl.list(queryimpl.java:573)     @ org.hibernate.jpa.internal.queryimpl.getresultlist(queryimpl.java:449)     ... 12 more 

i wasn't able find explanation in documentation behavior. sure, it's simple thing solve passing id of person or managed entity parameter. understand why started occurs. knows why?

thanks!

hibernate needs verify object not transient, otherwise not make sense use in query.

how hibernate check whether object transient? wasn't able find official documentation on this, looked @ source code. part of method abstractentitypersister.istransient looks this:

// check version unsaved-value, if appropriate final object version = getversion( entity ); if ( isversioned() ) {     // let take precedence if defined, since works     // assigned identifiers     boolean result = entitymetamodel.getversionproperty()             .getunsavedvalue().isunsaved( version );     if ( result != null ) {         return result;     } } 

as can see, hibernate inspect value of version field (among other things) try verify whether object transient.

since version in prototype person null (or other unsaved value, based on strategy determines unsaved value is), hibernate knows instance transient , throws exception. without versioning, hibernate checks whether person id null (or other unsaved value, based on strategy) make distinction between transient , non-transient instances:

// check id unsaved-value boolean result = entitymetamodel.getidentifierproperty()         .getunsavedvalue().isunsaved( id ); if ( result != null ) {     return result; } 

so worked before introduced versioning, because id not null.

to overcome best pass in id query suggested. or can set version nperson prototype use in query:

person nperson = new person(); nperson.setid(1); nperson.setversion(1); 

here can set version value because not used anyway; hibernate see not null , not consider object transient.


Comments

Popular posts from this blog

javascript - Karma not able to start PhantomJS on Windows - Error: spawn UNKNOWN -

c# - Display ASPX Popup control in RowDeleteing Event (ASPX Gridview) -

Nuget pack csproj using nuspec -