[
https://issues.apache.org/jira/browse/CAMEL-24129?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18096803#comment-18096803
]
Claus Ibsen commented on CAMEL-24129:
-------------------------------------
Fixed via https://github.com/apache/camel/pull/24790
> camel-jpa: JpaConsumer ignores the configured preDeleteHandler and re-derives
> it via reflection on every message
> ----------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24129
> URL: https://issues.apache.org/jira/browse/CAMEL-24129
> Project: Camel
> Issue Type: Bug
> Components: camel-jpa
> Reporter: Federico Mariani
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.22.0
>
>
> h3. Problem
> {{JpaConsumer.processBatch()}} (JpaConsumer.java:199) calls:
> {code:java}
> createPreDeleteHandler().deleteObject(batchEntityManager, result, exchange);
> {code}
> instead of the cached accessor {{getPreDeleteHandler()}}
> (JpaConsumer.java:259-264), which lazily creates and *caches* the handler:
> {code:java}
> public DeleteHandler<Object> getPreDeleteHandler() {
> if (preDeleteHandler == null) {
> preDeleteHandler = createPreDeleteHandler();
> }
> return preDeleteHandler;
> }
> {code}
> The {{@Consumed}} counterpart a few lines below (line 215) does it correctly
> via {{getDeleteHandler()}}.
> h3. Impact
> # A user-supplied {{preDeleteHandler}} (the {{@UriParam(label = "consumer")}}
> option wired in {{JpaEndpoint.createConsumer()}}, JpaEndpoint.java:97-98/160)
> is *never invoked* -- {{createPreDeleteHandler()}} always re-derives the
> handler from the {{@PreConsumed}} annotation scan on the entity class (or
> falls back to the no-op default), completely bypassing anything set via
> {{setPreDeleteHandler}} / the {{preDeleteHandler}} URI option.
> # {{createPreDeleteHandler()}} runs
> {{AnnotationHelper.findMethodsWithAnnotation(entityType, PreConsumed.class)}}
> -- a reflective scan of the entity's methods -- for *every entity of every
> poll batch*, instead of once per consumer lifetime.
> h3. How to reproduce
> Configure a route with a custom {{preDeleteHandler}}:
> {code:java}
> JpaEndpoint endpoint = ...;
> endpoint.setPreDeleteHandler((em, entityBean, exchange) -> called.set(true));
> {code}
> and observe that {{called}} is never set to {{true}} even though the row is
> consumed normally, because {{processBatch}} never calls
> {{getPreDeleteHandler()}}.
> h3. Suggested fix
> Change line 199 to call {{getPreDeleteHandler()}} instead of
> {{createPreDeleteHandler()}}, mirroring the
> {{@Consumed}}/{{getDeleteHandler()}} pattern already used a few lines below.
> Found during a broader camel-jpa code review (July 2026).
> _Claude Code on behalf of Croway_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)