I have experienced the same issues. Additionally to your points I had problems that the session was closed after calling a subflow and that a class called org.hibernate.util.MarkerObject used by Hibernate (sometimes) can not be serialized.

Originally Posted by
and
1. The session in the first flow remains the same and it can't get changes made by the subflow (showing cached objects)
In case a commit of the subflow data is not a problem I reload the data in the on-render element of the parent flow (fetching data again after subflow has ended).
You could also consider to merge an output of the subflow into the persistenceContext of the parent flow (I can remember to have tried it but there was some problem which I can't remember).

Originally Posted by
and
3. Sometimes changes made in loaded objects are being persisted even when it isn't needed. I know it should be solved by using @Transational(readOnly=false) when laoding those objects, but sometimes this doen't help by unknown reason.
It should be @Transational(readOnly=true) to tell Hibernate not to flush the changes in the persistenceContext. In general I'm using the
Code:
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
on the class definition level and mark the methods which have to trigger a commit with
Code:
@Transactional(propagation=Propagation.REQUIRED, readOnly=false).
Because I have a lot of database changes without leaving the view definition (Ajax) I do not have a commit at the end-state because my changes are committed by the methods marked as readOnly=false.
I have not tried to mark everything as readOnly=false and have a commit in the end-state, I just (ab)use the <persistence-context> for lazy-loading (it was the only solution which was working for me).
In case somebody knows a more elegant way to just have lazy-loading I'm happy to hear!
- Peter