On 10 juil. 2010, at 09:05, Adam Warski wrote:
This, however, as it turns out, causes big problems in a JTA
environment (with resource-local txs all works fine): audit records are sometimes not
written. This is because the before tx completion process is called before tx
synchronizations, and in JTA the auto-flush at the end of a session is done using a TX
synchronization (AbstractEntityManagerImpl:1020). And it doesn't look like exceptions
are eaten when thrown from a synchronization in JTA - otherwise any exception that
occurred during a flush would go unnoticed (and I know from practice this doesn't
happen ;) ).
FYI, HEM does register the flush as a Synchronization operation because flush is
conditionally executed (based on the fact that a PC has joined the tx or not).
I could try and do the beforeCommit phase as an actionQueue#registerProcess(), but the
question is will it fix the problem all the time? Today the impl seems to rely on a List
so it's likely to work if the em#joinTransaction call is done before Hibernate Search
and Hibernate Envers registrations.