java - OpenSessionInViewFilter cascade merge problems -
i using opensessioninviewfilter, spring, , hibernate data access. opensessioninviewfilter configured this
<filter> <filter-name>opensessioninviewfilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.opensessioninviewfilter</filter-class> <init-param> <param-name>sessionfactorybeanname</param-name> <param-value>sessionfactory</param-value> </init-param> <init-param> <param-name>singlesession</param-name> <param-value>false</param-value> </init-param> </filter> now have entity mapped annotations, that
@entity @table(name = "service_user") @cacheable @cache(usage = cacheconcurrencystrategy.nonstrict_read_write) public class serviceuser implements serializable { @id @generatedvalue(generator = "service_user_id_generator", strategy = generationtype.sequence) @sequencegenerator(name = "service_user_id_generator", sequencename = "service_user_id_gen", allocationsize = 1) private long id; @manytoone @joincolumn(name = "contract_type_id") @foreignkey(name = "service_user_ct_fk") private serviceusercontracttype contracttype; } now i'm trying construct , save new serviceuser entity. have service retrieves serviceusercontracttype database , sets corresponding field in newly created service user. method gets contarct types database marked transactional.
to save service user use
sessionfactory.getcurrentsession().merge(serviceuser) if try method retrive contract type
public serviceusercontracttype getcontracttype(long id){ criteria criteria = sessionfactory.getcurrentsession().createcriteria(serviceusercontracttype.class); criteria.add(restrictions.eq("id", id)); return (serviceusercontracttype) criteria.uniqueresult(); } then, moment merge called recieve
object references unsaved transient instance - save transient instance before flushing exception. it, add cascade = cascadetype.merge @manytoone annotation in service user mapping , works. but... if use
public serviceusercontracttype getcontracttype(long id){ return (serviceusercontracttype) sessionfactory.getcurrentsession().load(serviceusercontracttype.class, id); } it works without cascade merge option. difference see while debugging first method (with criteria) returns loaded contract type entity, , load variant returns uninitialized proxy.
can explain how things work in scenarios? why proxy can merged without cascade? why criteria returns not proxy initialized entity?
Comments
Post a Comment