[hibernate-dev] firing proper events after HQL?
Steve Ebersole
steve at hibernate.org
Sat Nov 28 10:35:38 EST 2009
Two difficulties I just realized:
First is that we actually only use the temporary table approach in the
case of update/delete against 'multi-table structures'. In a basic or
table-per-hierarchy entity structure the temporary table is currently
not used. If this is something y'all agree is needed, what I can do is
to look at making the listeners influence the decision whether or not to
use temporary tables (currently that decision is solely based on the
entity structure).
Second is the fact that the 'id table' rows are cleaned up immediately
afterwards. The Query#executeUpdate() process goes something like:
1) populate 'id table'
2) execute update/delete utilizing 'id table'
(fire this new event)
3) clean up the 'id table'
On Wed, 2009-11-25 at 14:46 +0100, Adam Warski wrote:
> Either a "lazy structure" or the table name + utility method to read content of the table, as that's the operation all users of such listeners would need.
>
> Adam
>
> On Nov 24, 2009, at 9:09 PM, Emmanuel Bernard wrote:
>
> > If you return a "lazy structure", we could avoid the overhead unless the data is needed :)
> >
> > On 24 nov. 09, at 20:52, Steve Ebersole wrote:
> >
> >> I think it will just pass the table name. Too much overhead to
> >> materialize all the ids when the event may not even be used.
> >>
> >> On Tue, 2009-11-24 at 20:21 +0100, Emmanuel Bernard wrote:
> >>> Good idea,
> >>> If we could have an event listener that indeed does provide the
> >>> information lazily, we could definitely benefit from it. But that has
> >>> a cost so I think I would still keep it optional on the HSearch side.
> >>>
> >>> On 24 nov. 09, at 19:53, Adam Warski wrote:
> >>>
> >>>> Hello,
> >>>>
> >>>> I don't exactly know how bulk operations work, and I didn't know
> >>>> that there's a temporary table with the affected ids available.
> >>>> But if so, then yes, such an event would solve the problem, in the
> >>>> way Steve described. (And I got asked about bulk operations quite a
> >>>> lot of times, always answered that it isn't possible :) ). I think
> >>>> that both Envers and Search would need the ids affected + the entity
> >>>> type + the type of the operation (delete, insert, update).
> >>>>
> >>>> If it's possible, it would be great to have that :)
> >>>>
> >>>> Adam
> >>>>
> >>>> On Nov 24, 2009, at 3:11 PM, Steve Ebersole wrote:
> >>>>
> >>>>> How about a new event right at the moment after we have just
> >>>>> collected
> >>>>> all the ids into the temp table?
> >>>>>
> >>>>> For envers, this would allow you to save off the current state
> >>>>> prior to
> >>>>> the update/delete.
> >>>>>
> >>>>> For search, this would allow you to "circle back" after the operation
> >>>>> and re-index those matching ids.
> >>>>>
> >>>>> wdyt?
> >>>>>
> >>>>>
> >>>>> On Tue, 2009-11-24 at 08:20 +0100, Adam Warski wrote:
> >>>>>> Hello,
> >>>>>>
> >>>>>>> a user on forums is posting about an HQL like
> >>>>>>> "delete from product where id = 4"
> >>>>>>> which - in case of Hibernate Search - is not going to remove the
> >>>>>>> relevant document from the index.
> >>>>>>>
> >>>>>>> Another interesting case would be
> >>>>>>> "delete from product"
> >>>>>>>
> >>>>>>> Any thoughts about this? Should we always use API when making
> >>>>>>> changes?
> >>>>>>> (https://forum.hibernate.org/viewtopic.php?f=9&t=1001076)
> >>>>>>
> >>>>>> In general listeners for any bulk operations aren't fired (in case
> >>>>>> of a bulk update the indexes won't be updated either). This is a
> >>>>>> problem also in Envers - where doing bulk operations doesn't cause
> >>>>>> any historical data to be written in the audit tables. What I
> >>>>>> normally advise users on the forum is to:
> >>>>>> 1) run a hql which updates the historical tables (bascially
> >>>>>> inserting new rows for each id affected by the hql to be executed)
> >>>>>> 2) run the original hql
> >>>>>>
> >>>>>> For HSearch, I guess a solution would be to provide an API to tell
> >>>>>> HSearch that some range of ids of some entity changed. So the user
> >>>>>> would:
> >>>>>> 1) get the ids affected by the query (this usually means replacing
> >>>>>> delete/update by select)
> >>>>>> 2) run the original hql
> >>>>>> 3) pass the ids to hsearch so that it could update the indexes
> >>>>>>
> >>>>>> However, I'm not sure if there would be much performance gain
> >>>>>> comparing using a bulk operation to a for-loop with
> >>>>>> entityManager.delete in that case (HSearch would have to handle
> >>>>>> each entity separately anyway; maybe not in case of a delete, but
> >>>>>> certainly in case of an update).
> >>>>>>
> >>>>> --
> >>>>> Steve Ebersole <steve at hibernate.org>
> >>>>> Hibernate.org
> >>>>>
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> hibernate-dev mailing list
> >>>> hibernate-dev at lists.jboss.org
> >>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >>>
> >> --
> >> Steve Ebersole <steve at hibernate.org>
> >> Hibernate.org
> >>
> >
>
--
Steve Ebersole <steve at hibernate.org>
Hibernate.org
More information about the hibernate-dev
mailing list