flowable / flowable/flowable-engine

Engine: JPA entity proxy object cannot be used as a process variable

Offen
#1,806 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Java
Sterne
9.5k
Forks
2.9k
Ø Merge
7 Std. 8 Min.
Gemergte PRs (30 T.)
2

Beschreibung

When using the JPA integration it is possible to use the entities as process variables e.g. in a multi-instance loop. The JPA provider may return a proxy object for the real entity e.g. for lazy loading in one-to-may collections.

Flowables way to get the Id of the entity object via reflection (at least for field access) for storing it as a process variable in JPAEntityMappings.getIdValue(Object value, EntityMetaData metaData) is broken when proxy objects are used. Tested with Hibernate 5.3.10 bundled with Spring Boot 2.1.5.

Tested with Flowable 6.4.1

Example Exception:

org.flowable.common.engine.api.FlowableIllegalArgumentException: Value of primary key for JPA-Entity cannot be null
at org.flowable.variable.service.impl.types.JPAEntityMappings.getIdString(JPAEntityMappings.java:168) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.types.JPAEntityMappings.getJPAIdString(JPAEntityMappings.java:87) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.types.JPAEntityVariableType.setValue(JPAEntityVariableType.java:72) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntityImpl.setValue(VariableInstanceEntityImpl.java:139) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntityManagerImpl.create(VariableInstanceEntityManagerImpl.java:50) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.persistence.entity.VariableScopeImpl.createVariableInstance(VariableScopeImpl.java:887) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.createVariableInstance(ExecutionEntityImpl.java:720) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.createVariableLocal(ExecutionEntityImpl.java:741) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.setVariableLocal(ExecutionEntityImpl.java:684) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.setVariableLocal(ExecutionEntityImpl.java:664) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.variable.service.impl.persistence.entity.VariableScopeImpl.setVariableLocal(VariableScopeImpl.java:737) ~[flowable-variable-service-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior.setLoopVariable(MultiInstanceActivityBehavior.java:401) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior.executeOriginalBehavior(MultiInstanceActivityBehavior.java:319) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior.createInstances(ParallelMultiInstanceBehavior.java:86) ~[flowable-engine-6.4.1.jar:6.4.1]
at org.flowable.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior.execute(MultiInstanceActivityBehavior.java:115) ~[flowable-engine-6.4.1.jar:6.4.1]

It looks like the field was identified, but its value via reflection is null, although calling a getter for the id on the object will return the correct value.

JPA 2.0 introduced a generic API for getting the identifier of an entity object via:
entityManagerFactory.getPersistenceUnitUtil().getIdentifier(value)

Maybe this API should be used instead of reflection.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie in JPAEntityMappings.getIdValue(Object value, EntityMetaData metaData) und folgen Sie dem in der Exception gezeigten getIdString-Pfad. Reproduzieren Sie das Problem mit einem trägen Hibernate-Proxy und untersuchen Sie die reflexionsbasierte Identifikatorermittlung. Vergleichen Sie sie mit der Identifikator-API von JPA 2.0 PersistenceUnitUtil und überprüfen Sie anschließend, dass die Entität im Multi-Instance-Fall als Prozessvariable gespeichert werden kann.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
databases
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.