"Sammy8306" wrote : As far as I know, SMPC is scoped over the conversation. 
That would be the implicit temporary conversation if no conversation is started 
manually. 
  | You have two options: either make sure the edits happen in the same 
conversation (and therefore the same EM) or merge the offending object into the 
second EM instance (using em.merge()).

Hmm. I thought to have done that. The selectBenutzer() method which is called 
on selection of a Benutzer in the list calls beginConversation(), which
is marked with @Begin(flushMode = FlushModeType.MANUAL)

then when the save butten is pressed commit() is called which is marked with 
@End(beforeRedirect=true) and calls em.flush().

Would'nt that mean i span a conversation around the whole edit process ?

"petemuir" wrote : Yes, use a SMPC, not an extended PC.  You don't want the 
@Transactional on those methods (it's an entity bean)

Can you please explain why thats not needed? Do Entity beans always have an 
implicit transactional behavior??

"petemuir" wrote : and you probably want to let hibernate take care up updating 
the relationship for you - call entityManager.refresh(foo) to get hibernate to 
do this.

cool. So i dont need the add/remove on the list? But where should i do that 
call? I suppose i cant do it in the entity itself, because that would be ugly 
despite the fact that the entity doesnt know the PC.

So i tried to do it in BenutzerManager.save() with no luck like that:

  |     @DataModelSelection
  |     @Out(required = false)
  |     private BenutzerImpl selectedBenutzer;
  | 
  |     private GruppeImpl selectedGruppe;
  |     
  |     public void selectBenutzer()
  |     {
  |             selectedGruppe = 
mowitaEntityManager.merge(selectedBenutzer.getGruppe());
  |             beginConversation();
  |     //      log.info("BenutzerManager selectBenutzer(#0)\n", 
selectedBenutzer);
  |     //      log.info("BenutzerManager editedBenutzer(#0)\n", 
editedBenutzer);
  | 
  | //          benutzer= selectedBenutzer;
  |     }
  | 
  |     @End(beforeRedirect=true)
  |     public void commit()
  |     {
  |             log.info("Merging selectedBenutzer: #0", selectedBenutzer);     
        
  |             mowitaEntityManager.merge(selectedBenutzer);
  | 
  |             log.info("refreshing selectedGruppe: #0", selectedGruppe);      
                        
  |             mowitaEntityManager.refresh(selectedGruppe);
  |             
  |             log.info("flushing...");                        
  |             mowitaEntityManager.flush();
  |             
  |             mowitaEntityManager.refresh(selectedBenutzer.getGruppe());
  |             mowitaEntityManager.flush();
  |             
  |     }
  | 

I get an java.lang.IllegalArgumentException: Entity not managed by the call to
mowitaEntityManager.refresh(selectedGruppe);

The question is, how to get the gruppe that was selected before the user choose 
a new one, because if i call selectedBenutzer.getGruppe() in the save() method 
i already get the new Gruppe. Refreshing that newly selected Gruppe seems to 
work although i gat a lazy initialisation exception afterwards, when trying ot 
show the list of Gruppen.

Thanks for your help,
Tobias


View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4040889#4040889

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4040889
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to