cancel
Showing results for 
Search instead for 
Did you mean: 

Activiti 5.11: wrong historicDetailResultMap_postgres

xandros
Champ in-the-making
Champ in-the-making
Hi,

After upgrade to Activiti 5.11 the query:


List<HistoricDetail> hds = historyService.createHistoricDetailQuery().processInstanceId(processInstanceId).variableUpdates().orderByTime().desc().list();

return HistoricDetail that not implements HistoricDetailVariableInstanceUpdateEntity, then is impossible access variable informations (via cast).

I use POSTGRES as DB and I think only this db is affected, indeed after some investigation I found a problem in HistoricDetail.xml:

The "createHistoricDetailQuery" use "historicDetailResultMap" that in case of POSTGRES is remapped to "historicDetailResultMap_postgres".
In "historicDetailResultMap_postgres" definition there is:


<discriminator javaType="string" column="TYPE_">
      <case value="VariableUpdate" resultMap="historicVariableUpdateResultMap_postgres"/>
      <case value="FormProperty" resultMap="historicFormPropertyResultMap"/>
</discriminator>

but "historicVariableUpdateResultMap_postgres" is not defined, then the MyBatis fails to map data.

My workaround is change "historicVariableUpdateResultMap_postgres" in "historicVariableUpdateResultMap" that is defined after in HistoricDetail.xml.


<discriminator javaType="string" column="TYPE_">
      <case value="VariableUpdate" resultMap="historicVariableUpdateResultMap"/>
      <case value="FormProperty" resultMap="historicFormPropertyResultMap"/>
</discriminator>

Now query works and is possible to cast returned HistoricDetail to HistoricVariableUpdate.

Can you apply patch on next release please?

Best regards!
4 REPLIES 4

udoderk
Champ in-the-making
Champ in-the-making
Hi,

After upgrade to Activiti 5.11 the query:


List<HistoricDetail> hds = historyService.createHistoricDetailQuery().processInstanceId(processInstanceId).variableUpdates().orderByTime().desc().list();

return HistoricDetail that not implements HistoricDetailVariableInstanceUpdateEntity, then is impossible access variable informations (via cast).


but "historicVariableUpdateResultMap_postgres" is not defined, then the MyBatis fails to map data.

My workaround is change "historicVariableUpdateResultMap_postgres" in "historicVariableUpdateResultMap" that is defined after in HistoricDetail.xml.
….

Now query works and is possible to cast returned HistoricDetail to HistoricVariableUpdate.

Can you apply patch on next release please?

Best regards!

Hi xandros,

1. The HistoricDetailVariableInstanceUpdateEntity is assigned to s.c. internal implementation classes.
all classes in packages that have .impl. (e.g. org.activiti.engine.impl.pvm.delegate) in them are implementation classes and should be considered internal. No stability guarantees are given on classes or interfaces that are in implementation classes. (c, userguide)

So no guarantee exists, that such class will be existed in next release. Smiley Indifferent

2. The cast to interface implementation (HistoricDetailVariableInstanceUpdateEntity) is bad smell. You should be programming to the interface not the implementation class. If the needed informations are hidden, but those are needed, so the request to make it public would be better :geek:

3. The cast to interface HistoricVariableUpdate if only parent interface HistoricDetail
is available on the return result of method
historyService.createHistoricDetailQuery().processInstanceId(processInstanceId).variableUpdates().orderByTime().desc().list(); shows, that the method with HistoricVariableUpdate as returned list is needed too.

xandros
Champ in-the-making
Champ in-the-making
Hi,

I try cast to HistoricDetailVariableInstanceUpdateEntity because cast to HistoricVariableUpdate not works. Reflection to returned HistoricDetail shows that it not implements HistoricVariableUpdate interface. This is my full code:


List<HistoricDetail> hds = historyService.createHistoricDetailQuery().processInstanceId(processInstanceId).variableUpdates().orderByTime().desc().list();
for(HistoricDetail hd : hds){
  if(hd instanceof HistoricVariableUpdate){
    HistoricVariableUpdate var = (HistoricVariableUpdate)hd;
  }
}

but never go into "if(hd instanceof HistoricVariableUpdate)" section.
In DB I have historic VariableUpdates and with workaround it works.
Can you test the original implementation on Postgres?

frederikherema1
Star Contributor
Star Contributor
Hi, thanks for reporting this. I stumbled upon this issue today an will get it fixed asap…

https://jira.codehaus.org/browse/ACT-1512

xandros
Champ in-the-making
Champ in-the-making
OK, thanks!