[hibernate-dev] HHH-3225 is hitting Hibernate Search
Emmanuel Bernard
emmanuel at hibernate.org
Fri Mar 13 18:18:32 EDT 2009
hello
On Mar 13, 2009, at 17:54, Sanne Grinovero wrote:
> Hi,
> about this issue (HSEARCH-178) I've implemented a patch following your
> directions and
> your idea is working very well, but I'm having some trouble about the
Cool
>
> configuration
> of listeners.
>
> An additional flush listener is needed; I've patched the
> autoregistration but people
> not using annotations will have to specify both
> DefaultFlushEventListener and the
> new IndexWorkFlushEventListener in their configuration.
yes. Actually you might have to listen to both flush and auto-flush.
>
> I've been able to specify the pair of listeners using programmatic
> configuration
> and using hibernate.cfg.xml but is this also possible with
> hibernate.properties
no
>
> and persistence.xml ?
yes
add the property
hibernate.ejb.event.flush =
org.hibernate.ejb.event.EJB3FlushEventListener, o.h.s.e.
IndexWorkFlushEventListener
http://hibernate.org/hib_docs/entitymanager/reference/en/html_single/#d0e500
>
> I couldn't find any docs or examples to register two event listeners
> for the
> same event in JPA, I'm wondering if instead of adding a listener I
> should
> not extend or wrap the DefaultFlushEventListener so to have only one
> listener?
I don't like the idea, we introduce arrays of event listeners for that
purpose.
>
>
> Would this work for JPA also or should I have to extend the
> EJB3FlushEventListener
> instead? I see it's different.
Yes you would need a different one or different two because of
(EJB3AutoFlushEventListener). so not a good idea :)
>
>
> In case the JPA listener should be different than the hibernate
> version, how can I
> detect the listener I should register in the EventListenerRegister
> autoregistration
> routine?
Another good reason why it's a bad idea.
>
>
> To be backwards-compatible with our own configuration I've slightly
> modified
> the patch to work as the old way (loading collections in flush) when
> the listener
> is not found; a warning is logged saying the listener should be
> registered.
I don't quite understand why, the new EventListenerREgister will be
bundled with the IndexWork Listener always right? What backward
compatible mode do you have?
BTW, you should put a warning in the log when this event listener is
used.
"Applying change to the full-text index before transaction completion.
Please use a Hibernate aware transaction (eg
org.hibernate.Transaction, javax.persistence.EntityTransaction, JTA
transaction with the proper TransactionFactory setting)"
>
>
> hope we can fix this,
> Sanne
>
>
> 2009/3/7 Emmanuel Bernard <emmanuel at hibernate.org>:
>> We discussed the issue with Sanne and for Hibernate Search we have a
>> workaround solution that does not penalize Hibernate Core. This
>> solution can
>> be applied by everybody but it's not the easiest thing on Earth.
>>
>> The idea is to queue as you said but inside custom event listeners.
>> In our
>> case some Post* event listeners. This queue is "flushed" in a
>> FlushEventListener. This new flush event listener must be
>> registered *after*
>> the default FlushEventListener.
>>
>> All this does not require Hibernate Core change and requires
>> minimal change
>> to the Hibernate Search code and architecture.
>>
>> On Mar 6, 2009, at 10:15, Steve Ebersole wrote:
>>
>>> Not sure what you mean by your "In theory it should not"... The
>>> very
>>> nature of @PostUpdate is that it is going to be getting called
>>> during a
>>> flush cycle...
>>>
>>> ----
>>>
>>> wrt "is it possible to move the post* event after the flush?"...
>>>
>>> There are really 2 answers.
>>>
>>> 1) According to the JPA spec, can we do this? The quote from the
>>> current spec says:
>>> <quote>
>>> The PreUpdate and PostUpdate callbacks occur before and after the
>>> database update operations to
>>> entity data respectively. These database operations may occur at the
>>> time the entity state is updated or
>>> they may occur at the time state is flushed to the database (which
>>> may
>>> be at the end of the transaction).
>>> </quote>
>>> I don't really see anything there that discusses the time-
>>> relationship
>>> between the SQL UPDATE execution and the @PostUpdate callback
>>> other than
>>> the fact that (obviously) @PostUpdate callback should come after
>>> the SQL
>>> UPDATE is issued; but it does not seem to limit *how long after*.
>>> So I
>>> think this is OK from the perspective of the spec.
>>>
>>> 2) Can Hibernate be changed to do this? Well AnythingIsPossible in
>>> programming, so I guess the question really is *should* we change
>>> Hibernate to do this. My main concern with this change is the extra
>>> queueing it would require and the corollary memory requirements.
>>> What
>>> happens right now is that those callbacks are executed during the
>>> action
>>> (org.hibernate.action.Executable) execution. Flush puts them into a
>>> queue of actions (org.hibernate.engine.ActionQueue), from which
>>> they are
>>> removed as they are executed. We decided to put the post
>>> callbacks in
>>> the actions themselves for assurance-of-execution as well as
>>> encapsulation purposes, which I think are both still worthwhile.
>>> What I
>>> could see as a potential solution would be to do something like we
>>> do
>>> for Actions which have "after transaction" tasks to perform:
>>>
>>> http://fisheye.jboss.org/browse/Hibernate/core/trunk/core/src/main/java/org/hibernate/engine/ActionQueue.java?r=16091#l271
>>>
>>> The "executions" list here is a queue of actions which we need to
>>> keep
>>> around for later. I can see something like that in conjunction
>>> with a
>>> method on ActionQueue to process that internal 'callbacks' queue
>>> after
>>> the entire flush is complete. Note that this does not address
>>> @PreUpdate.
>>>
>>> We can investigate that though and see what we are talking about in
>>> specific.
>>>
>>> -
>>>
>>> Steve Ebersole
>>> Project Lead
>>> http://hibernate.org
>>> steve at hibernate.org
>>>
>>> Principal Software Engineer
>>> JBoss, a division of Red Hat
>>> http://jboss.com
>>> http://redhat.com
>>> steve.ebersole at jboss.com
>>> steve.ebersole at redhat.com
>>>
>>>
>>> On Fri, 2009-03-06 at 09:07 -0500, Emmanuel Bernard wrote:
>>>>
>>>> Ahhh
>>>> In theory it should not as Hibernate Search reads data in the
>>>> beforeCompletion phase.
>>>> Unless people do not apply changes in a transaction in which case
>>>> we
>>>> need to execute the read in the post* event.
>>>>
>>>> We will check whether or not people use surrounding transactions
>>>> (Hibernate aware Tx either through JTA or via the direct Hibernate
>>>> Transaction API).
>>>> Alternatively, is it possible to move the post* event after the
>>>> flush?
>>>> Or create noew events for that? That would solve everybody's issue.
>>>>
>>>> Emmanuel
>>>>
>>>> On Mar 5, 2009, at 22:54, Steve Ebersole wrote:
>>>>
>>>>> Is this somehow different than the "attempt to load stuff into
>>>>> the PC
>>>>> during flush" scenarios I see in any of these related issues?
>>>>>
>>>>> -
>>>>>
>>>>> Steve Ebersole
>>>>> Project Lead
>>>>> http://hibernate.org
>>>>> steve at hibernate.org
>>>>>
>>>>> Principal Software Engineer
>>>>> JBoss, a division of Red Hat
>>>>> http://jboss.com
>>>>> http://redhat.com
>>>>> steve.ebersole at jboss.com
>>>>> steve.ebersole at redhat.com
>>>>>
>>>>>
>>>>> On Thu, 2009-03-05 at 19:14 -0500, Emmanuel Bernard wrote:
>>>>>>
>>>>>> http://opensource.atlassian.com/projects/hibernate/browse/
>>>>>> HHH-3225
>>>>>>
>>>>>> Steve, any chance you could look at this one, it seems to hit
>>>>>> HSearch
>>>>>> users on a regular basis.
>>>>>> _______________________________________________
>>>>>> hibernate-dev mailing list
>>>>>> hibernate-dev at lists.jboss.org
>>>>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>>>
>>>>
>>>
>>
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>
More information about the hibernate-dev
mailing list