That works just fine when I @Inject a hibernate session directly into a DAO
and say, persist an object ... but there's a catch.
In my world - a DAO is a very low level, granular thing. I inject DAOs into
my PersistenceService which gets invoked from my Management layer and I want
the Transaction definitions at the *PersistenceService *layer - not the
individual DAO layer. If I need to atomically commit 5 saves - I need to
define a service layer method with @CommitAfter.
In the following code snippet, I have the @CommitAfter where I'd logically
like it ... unfortunately, nothing gets persisted when I put it there. I
know the path is correct (web IS submitting a valid project object since,
this works fine when @CommitAfter is on the DAO method and the AppModule
@Match tag changes accordingly.
Thoughts?
*Tapestry config:
*
public class *AppModule*
{
public static void bind(ServiceBinder binder)
{
binder.bind(ProjectManager.class, SimpleProjectManager.class);
binder.bind(WriteDao.class, HibernateWriteDao.class);
binder.bind(PersistenceService.class, PersistenceService.class);
}
@Match("*PersistenceService")
public static <T> T
decorateTransactionally(HibernateTransactionDecorator decorator,
Class<T> serviceInterface,
T delegate,
String serviceId)
{
T obj = decorator.build(serviceInterface, delegate, serviceId);
return obj;
}
}
*from the web request:*
public class *CreateProject*
{
@Inject
private ProjectManager projectManager;
@Property
private Project newProject;
Object onSuccess()
{
projectManager.createProject(newProject);
return ListProjects.class;
}
}
*invoked from CreateProject.onSuccess*:
public class SimpleProjectManager implements ProjectManager
{
@Inject
private PersistenceService persistenceService;
public void createProject(Project project)
{
persistenceService.createProject(project);
}
}
*invoked from SimpleProjectManager:**
* public class PersistenceService
{
@Inject
private Session session;
@Inject
private WriteDao writeDao;
@CommitAfter
public void createProject(Project project)
{
// imagine other db saves here - and assume these must all
succeed... or all fail
writeDao.persist(session, project);
}
}
*and finally
*
public class HibernateWriteDao implements WriteDao
{
public void persist(Session session, Object obj)
{
session.persist(obj);
}
}
On Fri, Dec 5, 2008 at 6:04 PM, Luther Baker <[EMAIL PROTECTED]> wrote:
> Thanks - that worked just fine.
>
> -Luther
>
>
>
> On Fri, Dec 5, 2008 at 1:41 PM, James Hillyerd <[EMAIL PROTECTED]> wrote:
>
>> Look at the bottom of this page:
>>
>> http://tapestry.apache.org/tapestry5/tapestry-hibernate/userguide.html
>>
>> It explains how to get @CommitAfter working with DAOs.
>>
>> -james
>>
>> On Fri, Dec 5, 2008 at 10:20 AM, Luther Baker <[EMAIL PROTECTED]>
>> wrote:
>>
>> > If I inject a Hibernate session into my DAO and have my Tapestry
>> Controller
>> > invoke that, is there a Tapestry way that I can tell hibernate to start
>> and
>> > commit a transaction via annotations or configuration?
>> >
>> > IE:
>> >
>> >
>> http://tapestry.apache.org/tapestry5/tapestry-core/ref/org/apache/tapestry5/corelib/components/BeanEditForm.html
>> >
>> > public class CreateUser
>> > {
>> > @Inject
>> > private UserDAO userDAO;
>> >
>> > ...
>> > Object onSuccess()
>> > {
>> > userDAO.add(user);
>> >
>> > return UserAdmin.class;
>> > }
>> > }
>> >
>> > public class UserDAO
>> > {
>> > @Inject
>> > private Session session;
>> >
>> > void add(User user)
>> > {
>> > session.persist(user);
>> > }
>> > }
>> >
>> >
>> > I tried to use @CommitAfter in my DAO but that didn't work. I
>> essentially
>> > want to simulate:
>> >
>> > void add(User user)
>> > {
>> > session.beginTransaction();
>> > session.persist(user);
>> > sessino.getTransaction().commit();
>> > }
>> >
>> > but I don't want to explicitly code this in my DAO for fear that I may
>> have
>> > some instances where the the transactional boundaries must be larger.
>> >
>> > Maybe this isn't a Tapestry specific thing - but I'm not sure how to
>> inject
>> > the Hibernate Session into my DAO but have my Tapestry Controller define
>> > the
>> > transactional boundaries ... was hoping some Tapestry annotations might
>> > help
>> > me out.
>> >
>> > -Luther
>> >
>>
>>
>>
>> --
>> James A. Hillyerd <[EMAIL PROTECTED]>
>>
>
>