AFAIK, you cannot perform multiple data entry conversations in a nested fashion without having an all-or-nothing problem with regards to saving the data.
The problem is that each nested conversation uses the same persistence context, and when you flush for a nested conversation, you are flushing for all conversations using that persistence context (which includes all parent and child conversations). The conclusion I reached was that unfortunately, the nested conversation model was only good for browsing/navigating data due to the fact that it shares the persistence context. The Seam Issues example which was the only example to have editable pages in nested conversations was removed from the latest release (hope they re-write it to show how it should be done). Here are a couple of threads related to persistence contexts and nested conversations: http://www.jboss.com/index.html?module=bb&op=viewtopic&t=111681 http://www.jboss.com/index.html?module=bb&op=viewtopic&t=111384 However, thinking about your problem more, you may be able to do something like : Start root conversation (with flushmode = automatic) Create mother entity Persist mother entity Set the entityManager flush mode to Manual At this point, you are in a manual flush mode, with the mother entity already created and persisted. If the child item also has child items, then you are in a sticky problem. Also this solution doesn't handle the problem of : Edit Mother Entity Add child Edit child Flush entity manager to save child -> Ooops, we just accidentally saved the changes to the mother also since the child is edited in a nested conversation, and we flushed the shared persistence context. Also, if your 'add child' or 'edit child' links could be opened in new windows, then you could have accidental flushes in each conversation when you just meant to save and flush one instance of the child editor. As for rolling back the mother entity in the event of a conversation timeout... If you have a flag called isNew which indicates whether it is a new entity or not, you can write a cancel changes procedure, something like: | String cancelChanges() { | if (isNew) { | em.remove(motherItem); | } else { | em.refresh(motherItem); | } | } | | I don't know the feasability of this, perhaps someone with more knowledge than me can comment, but you have a method marked with the @Destroy annotation, you could just call the cancel changes method from there if it has not already been saved (i.e. isNew is still true). This might be icky, but come to think of it, I'm wondering if this is a pretty handy pattern because what the conversation times out and you have made edits to the entity involved? Those edits could sit around in the persistence context after the conversation has timed out. Should the entity be refreshed because the persistence context might be re-used with the dirty object in it? View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4063562#4063562 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4063562 _______________________________________________ jboss-user mailing list [email protected] https://lists.jboss.org/mailman/listinfo/jboss-user
