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]>
>>
>
>

Reply via email to