[Contrib: Evaluation System] [Building Sakai] Wrapping a method call in a Hibernate transaction/session?
Jim Eng
jimeng at umich.edu
Thu Feb 11 15:26:32 PST 2010
Thanks to both of you, Aaron and Antranig. I created a local wrapper for the EvalDaoInvoker and with a little more effort, that works.
Hallelujah!
Jim
Sent from my Verizon Wireless BlackBerry
-----Original Message-----
From: Antranig Basman <antranig.basman at colorado.edu>
Date: Thu, 11 Feb 2010 09:49:36
To: Jim Eng<jimeng at umich.edu>
Cc: Aaron Zeckoski<aaronz at vt.edu>; evaluation<evaluation at collab.sakaiproject.org>; Sakai Dev.<sakai-dev at collab.sakaiproject.org>
Subject: Re: [Building Sakai] Wrapping a method call in a Hibernate transaction/session?
On 11/02/2010 09:23, Jim Eng wrote:
> Hi Aaron,
>
> I'm back with another question about hibernate session management. The
> context is pretty much the same as the last two times I asked about
> this. I'm in a plain vanilla HttpServlet. I have available these EVALSYS
> singletons:
>
> - EvalEvaluationSetupService
> - EvalEvaluationService
> - EvalAuthoringService
>
> Each of these is accessed through its own
> "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" with
> the injected value for "transactionManager" a reference to
> "org.sakaiproject.springframework.orm.hibernate.GlobalTransactionManager".
> I thought would mean that my calls to the EVALSYS component would be in
> hibernate session/transactions, but I am still getting errors when I try
> to save an entity that contains a reference to another existing entity.
> The exception says there is no hibernate session.
>
> I'm wondering whether I should be using the EvalDaoInvoker to wrap
> everything related to my attempt to save an entity. We do not want to
> rollback all "create" and "update" actions because one fails, which
> suggests we want transactions at the level of a particular entity.
> Suppose I have a method to extract an EvalItem from an XML element and
> save it. The method attempts to retrieve an existing EvalItem and update
> it. If none is found, the method creates a new EvalItem and attempts to
> save it. If the XML element provides an EID for an EvalScale, the method
> retrieves the EvalScale and adds it to the java object representing the
> EvalItem before saving the EvalItem. I think I need to wrap that entire
> process in a transaction. Does that make sense?
>
> From your experience, does it seem like I might need to make explicit
> use of the EvalDaoInvoker to accomplish that? If so, is the way that's
> done in the inferDefaultViewParameters() method of the
> EvaluationVPInferrer class a good example of how it might be done?
>
> https://source.sakaiproject.org/contrib/evaluation/trunk/tool/src/java/org/sakaiproject/evaluation/tool/inferrers/EvaluationVPInferrer.java
>
>
> It's probably been a while since you've worked on this, so sorry to be
> pressing you for ideas. I hope some part of this might ring a bell that
> might help me. I've been digging through various docs related to
> Hibernate transactions and such, but in Sakai most of what we do with
> hibernate is several layers removed from the code I'm working on, so I'm
> not sure how to get any control over what I need to without upsetting
> other parts of the system.
>
> Suggestions welcome.
>
> Thanks.
>
> Jim
The method "invokeTransactionalAccess" which is provided at base by the
GenericDAO system is the method to be used for this. As you can see in
the VPInferrer, it accepts a Runnable which wraps the code which you
want to be suitably contextualised by whatever it is the DAO applies (in
this case, as you say, a Hibernate Session, Transaction, etc. and all
the associated gubbins) without provoking a dependency on invisible
classes. Just inject that bean and send your runnable into the
"invokeRunnable" method. Here is the relevant section from the
applicationContext.xml file of the tool:
<!-- special wrapper beans which work with genericdao to allow
hibernate lazy inits -->
<bean id="org.sakaiproject.evaluation.ModelAccessWrapperInvoker"
class="org.sakaiproject.evaluation.tool.wrapper.ModelAccessWrapperInvoker">
<property name="daoInvoker"
ref="org.sakaiproject.evaluation.dao.EvalDaoInvoker" />
</bean>
More information about the evaluation
mailing list