I'm using the plain hibernate Session (shadow) and the pattern works
great for me. But I think your problem is actually in "(don't flush
the
Session after an exception occurs)". You are doing something odd since
you need to nullify the id. For a new object, the id should normally
be null. Tapestry is already thinking it's a previously persisted
entity.

Kalle


On Fri, Sep 11, 2009 at 2:30 PM, Bruno Santos <bitbet...@gmail.com> wrote:
> Hello,
>
> Well, the reason should be that with persist in validate() i validate
> that the entity that's inserted doesn't conflict with any database
> constraint like in this case and the onsucess isn't fired wich in the
> case a constraint is violated it doesn't seem to make sense.
>
> Anyway, even if i use the code on the onSucess method it comes down to
> the same issue, the exception is thrown whenever i try to do any
> operation that requires hibernate (problem should be in
> hibernatesessionmanager, not being "clean").
>
> One way i guess it could solve the problem is discarding the current
> hibernatesessionmanager, invalidate it somehow, but i don't know if
> that's possible.
>
> Thanks
>
> On Fri, Sep 11, 2009 at 10:15 PM, Sven Homburg <hombu...@googlemail.com> 
> wrote:
>> what is your reason, that you want to persist the enity
>> in the validation event?
>>
>> i think its more clear to persist it in the onSuccess event method
>>
>> with regards
>> Sven Homburg
>> Founder of the Chenille Kit Project
>> http://www.chenillekit.org
>>
>>
>>
>>
>> 2009/9/11 Bruno Santos <bitbet...@gmail.com>
>>
>>> Thanks for your answer, i learned a bit more of tapestry.
>>>
>>> Now i have one more problem, not exactly related but in the same area.
>>>
>>> I have
>>>
>>>        void onValidateForm() {
>>>                if (entity.getId().longValue() == 0l) {
>>>                        league.setId(null);
>>>                }
>>>
>>>                System.out.println("OnValidateForm");
>>>                try {
>>>                _entityDAO.persist(entity);
>>>                } catch (RuntimeException ex) {
>>>                        leagueForm.recordError("error"); // EXCEPTION IS
>>> THROWN - THE TEST
>>> I'M DOING HITS THE UNIQUE CONSTRAINT
>>>                }
>>>
>>>        }
>>>
>>>        void onFailure() {
>>>                _entityDAO.abort();
>>>                System.out.println("onFailure");
>>>        }
>>>
>>> And this is working except it doesn't refresh the form with the errors
>>> i added on the onValidate
>>>
>>> When i use:
>>>
>>>        Object onFailure() {
>>>                _entityDAO.abort();
>>>                System.out.println("onFailure");
>>>                return this;
>>>        }
>>>
>>> The following exception is thrown:
>>>
>>> Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException:
>>> null id in pt.hi.asianconnect.entities.League entry (don't flush the
>>> Session after an exception occurs) [at
>>> classpath:pt/hi/asianconnect/components/generated/CreateUpdateLeague.tml,
>>> line 12]
>>>        at
>>> org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:62)
>>>        at
>>> org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl$1.read(InternalComponentResourcesImpl.java:510)
>>>        ... 119 more
>>> Caused by: org.hibernate.AssertionFailure: null id in
>>> pt.hi.asianconnect.entities.League entry (don't flush the Session
>>> after an exception occurs)
>>>        at
>>> org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:78)
>>>        at
>>> org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:187)
>>>        at
>>> org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143)
>>>        at
>>> org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
>>>        at
>>> org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
>>>        at
>>> org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
>>>        at
>>> org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:996)
>>>        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1589)
>>>        at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
>>>        at DefaultHibernateDAO.findByCriteria(DefaultHibernateDAO.java:104)
>>>
>>>
>>> The abort method from DAO was an experiment of mine wich calls
>>> hibernatesessionmanager.abort(). From what i understand, what happens
>>> is when the page is to be renderered, the hibernatesessionmanager
>>> that's used has "dirty" data that's why it uses
>>> SessionImpl.autoFlushIfRequired when i'm fetching data to refill the
>>> page, hence my experiment on calling the abort from
>>> hibernatesessionmanger, still this doesn't do it and i don't know how
>>> to "clean" data from the sessionmanager.
>>>
>>> Ideas anyone?
>>>
>>> One importante note, the test i'm doing implies that the my method
>>> that saveOrUpdate the entity is "hitting" a unique constraint
>>>
>>> On Thu, Sep 10, 2009 at 11:20 PM, Kalle Korhonen
>>> <kalle.o.korho...@gmail.com> wrote:
>>> > You should instead try storing it onValidate. If it fails, you should
>>> > record an error and if it succeeds you should commit only in onSuccess
>>> > (but the method body can be otherwise empty).
>>> >
>>> > Kalle
>>> >
>>> >
>>> > On Thu, Sep 10, 2009 at 2:55 PM, Bruno Santos <bitbet...@gmail.com>
>>> wrote:
>>> >> Good evening,
>>> >>
>>> >> I have a form using a zone and i have @CommitAfter on the
>>> >> onSubmitFromEntityForm()
>>> >>
>>> >> <t:form t:id="entityForm" zone="entityZone">
>>> >> <input type="text" t:type="textfield" t:id="name"
>>> >>                                        t:value="entity.name" />
>>> >> </t:form>
>>> >>
>>> >> @CommitAfter
>>> >> Object onSubmitFromEntityForm() {
>>> >>  ....
>>> >> try {
>>> >> entityDao.persist(entity);
>>> >> } catch (exception ex) {
>>> >>  // handle exception
>>> >> }
>>> >> }
>>> >>
>>> >> altough i'm handling the exception the @CommitAfter creates a new
>>> >> exception since it tries to commit something that's not in transaction
>>> >> due to catched exception.
>>> >>
>>> >> How to deal with this? Is there a way to avoid the @CommitAfter to
>>> >> execute ... a handler i can use? I think i can remove the @CommitAfter
>>> >> but don't believe this should be first option.
>>> >>
>>> >> ---------------------------------------------------------------------
>>> >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>> >> For additional commands, e-mail: users-h...@tapestry.apache.org
>>> >>
>>> >>
>>> >
>>> > ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>> > For additional commands, e-mail: users-h...@tapestry.apache.org
>>> >
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to