oasp / oasp4j

The Open Application Standard Platform for Java
Apache License 2.0
60 stars 303 forks source link

Instance with wrong modification counter returned by TablemanagementImpl #475

Closed jomora closed 6 years ago

jomora commented 8 years ago

Observation: When saving an existing Table via the REST api the returned instance's modification counter has not been incremented. When trying to save the same instance (with possibly altered values) again on a javax.persistence.OptimisticLockException is thrown.

Cause: After inspecting the code I found the following: TablemanagementImpl@130

The Javadoc of GenericDao.save states the following:

Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.

Obviously, line 130 of TablemanagementImpl does not adhere to this contract.

Solution: Change to TablemanagementImpl@130 tableEntity = getTableDao().save(tableEntity);.

Next steps: we have to check if this issue occurrs on the other components (Staff/Offer/Salesmanagement) as well.

jomora commented 8 years ago

I located usages of GenericDao#save:

The following picture shows all usages of GenericDao#save as shown by Eclipse. I used this list to identify potentially erroneous usages.

genericdao_save

The mentioned files must be reviewed!

hohwille commented 8 years ago

@jomora Your observation is completely right. Also all the places that you stated as "faulty" have to be fixed analogue. Thanks for figuring this out. IMHO the problem ist that the sample is just used occasionally and not maintained like a real productive customer project. Hence we have such issues there for a longer time. This is a big pity as the sample should actually act as a reference where to learn how to do it right. Currently this is unfortunately not the case. So with such issues we are getting closer to the actual goal.

jomora commented 8 years ago

@hohwille, thanks for the feedback. AFAIK @SimonHuber is already working on this. Please, assign him to this issue.

maybeec commented 7 years ago

@hohwille due to our local observations, the current solution does not seem to work deterministically.

In the GenericDao implementation, the entity to be saved is merged into the database. However, as the instruction is not executed immediately, the resulting updated entity does not have the increased modificationCounter. Therefore, we have to flush the entityManager instruction cache.

What I do not understand is, why this has not been observed so far. Any suggestions? Do I oversee anything?

hohwille commented 6 years ago

This issue is actually invalid. Hibernate only updates the modification counter only on flush or when the transaction is comitted. Hence, we created a solution for this problem already a long time ago but failed to update and close this issue. When an entity is converted to an ETO we connect that ETO internally with the Entity and implicitly update the modification counter during serialization. Works like a charm.

The "faulty" code indeed is not perfectly using the JPA contract but IMHO nearly all projects are writing code in this way as with common JPA vendor implementations like hibernate it does not matter at all. We could of course improve the code but actually the restaurant is a dead project and will be deleted. If someone cares for this kind of perfection review MTS (https://github.com/oasp/my-thai-star) and raise an issue there if needed.