If you use the OpenSessionInViewFilter, this problem goes away, as only one session is used for the entire request cycle.
The transaction interceptor doesn't just begin/commit transactions. It also allows you to declare which exceptions would need to cause a rollback (and which do not). Using the transaction-per-request paradigm and the transaction interceptor are not (as you pointed out in another email) mutually exclusive. If I was going to do transaction-per-request, I'd implement it as a filter (much like the OpenSessionInViewFilter), though. That way, my pages wouldn't have to worry about manually managing their transactions. If declarative ta-demarcation isn't necessary for your application, you can still use the HiveMind/Spring integration classes to write your TransactionPerRequestFilter. That way, all you're using is the PlatformTransactionManager to begin/commit/rollback your transaction. You would, however, have to manually set (or write use the transaction interceptor for this) the rollback only flag if you want to make sure that the transaction is rolled back. I would have to say that your 99% estimate is a bit high. I would agree that transaction-per-request would work for a high percentage, but not quite 99%. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Sent: Monday, April 24, 2006 6:19 AM To: 'Tapestry users' Subject: RE: [Honeycomb] net.sourceforge.hivetranse.transaction.MandatoryT ransactionException ah, now your seem to be running into the problem Mark Reynolds described in another thread. Now, you're calling a service-method (with ta required) to load you object, first hibernate session, return - session closed. Then your squeezer is called, second session, you pass it a hibernate proxy from another session - and WHAM. And: it's completely pointless to have multiple hibernate session per request (unless you have a very good reason and know what you do). So, you should really declare all your methods "mandatory" (sorry, I was wrong before). Then of course you'll have to start/commit your ta's above the service layer. And your cool ta-interceptor does nothing but check for the presence of a ta. Hey, why o why do you guys use think the declarative ta-stuff is useful for your apps? Do you reuse your dao's/services so heavily in completely different contexts? yes, yes, of course you can make it work. And it looks sooo enterprisy. But it's really just making something really simple, really complicated 99% of the time. Oh, sorry, now I'm really gettin into a rant, but I just don't get it And while I'm at it: - A hibernate entity IS NO POJO. Your class may be a POJC, but always assume that the object is some bytecode-enhanced proxy with access to the session it was loaded in. - A hibernate session is no db-connection, nor is it a db-transaction, it (usually) needs/has one. It's more of an in-memory representation of a subset (hopefully) of your db-entities. They *might* have been loaded in one DB-Transaction but they needn't be. > -----Original Message----- > From: Andreas Bulling [mailto:[EMAIL PROTECTED] > Sent: Monday, April 24, 2006 11:50 AM > To: Tapestry users > Subject: Re: [Honeycomb] > net.sourceforge.hivetranse.transaction.MandatoryT ransactionException > > > On 24. Apr 2006 - 09:10:32, Schulte Marcus wrote: > | It seems that hivetranse implicitly marks the hibernate > session methods > | "mandatory", assuming that eache service using it uses at > least "requires". > | Which is basically sound. you might try to mark your > HibernateSqueezer's > | squeeze method with ta-required (however you do this in hivetranse). > > Thanks for your answer! > I tried the following: > > <service-point id="HibernateSqueezer" > interface="org.apache.tapestry.util.io.SqueezeAdaptor"> > <invoke-factory> > <construct class="HibernateSqueezer"/> > </invoke-factory> > <interceptor > service-id="hivetranse.core.TransactionInterceptor"> > <method pattern="squeeze" demarcation="Required"/> > <method pattern="unsqueeze" demarcation="Required"/> > </interceptor> > </service-point> > > But now I get the following exception: > > org.hibernate.TransientObjectException > proxy was not associated with the session > messages: > > * proxy was not associated with the session > > throwableCount: 1 > throwables: > > * org.hibernate.TransientObjectException: proxy was not > associated with the session > > Stack Trace: > > * > org.hibernate.impl.SessionImpl.getEntityName(SessionImpl.java:1701) > * sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > * > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess > orImpl.java:39) > * > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth > odAccessorImpl.java:25) > * java.lang.reflect.Method.invoke(Method.java:585) > * > net.sourceforge.hivetranse.transaction.hibernate3.SessionProxy > Factory$SessionProxy.invoke(SessionProxyFactory.java:213) > * $Proxy33.getEntityName(Unknown Source) > * $Session_10acb48386b.getEntityName($Session_10acb48386b.java) > * $Session_10acb483705.getEntityName($Session_10acb483705.java) > * > de.plattform.services.HibernateSqueezer.squeeze(HibernateSquee > zer.java:50) > * sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > * > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess > orImpl.java:39) > * > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth > odAccessorImpl.java:25) > * java.lang.reflect.Method.invoke(Method.java:585) > * > net.sourceforge.hivetranse.transaction.TransactionInterceptorF > actory$Interceptor.invoke(TransactionInterceptorFactory.java:125) > * $Proxy36.squeeze(Unknown Source) > * > $SqueezeAdaptor_10acb483871.squeeze($SqueezeAdaptor_10acb483871.java) > * > org.apache.tapestry.util.io.DataSqueezerImpl.squeeze(DataSquee > zerImpl.java:127) > * > $DataSqueezer_10acb4836ff.squeeze($DataSqueezer_10acb4836ff.java) > * > org.apache.tapestry.form.Hidden.renderFormComponent(Hidden.java:58) > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]