-
1. Re: DataModel
tony.herstell1 Feb 10, 2007 3:22 PM (in response to vk101)I had a similar problem.
My "Find" Session Sateful bean had a liost of users.
My Controller Stateful conversational fiddled with the store of users.
When my Controller update the database; this was "behind" the back of the "Find" bean; so it didnt get reflected to the "find" beans "em" cache.
My solution is below (Gavin may have a better way to do it; but this works for me)
(need to inject the "Find" bean into the crud Controller bean naturally)@End @TransactionAttribute(TransactionAttributeType.REQUIRED) public String update() { log.info("> update"); user.setPassword(encryptionController.encrypt(user.getPassword())); em.merge(user); em.flush(); facesMessages.addFromResourceBundle("user_update_successful"); /* * We need to update this user in the list of users in the session scoped FindUserController */ if (findUserController != null) { log.info("User sent to database => " + user); findUserController.updateUserInExistingList(user); } log.info("< update"); return "findUser"; }
public void updateUserInExistingList(User updatedUser) { log.info("> updateUserInExistingList"); List<User> usersList = new ArrayList<User>(); for (User eachUser : users) { if (updatedUser.getId() != eachUser.getId()) { usersList.add(eachUser); } else { em.refresh(eachUser); // Force the update of the user in the em cache. log.info("User from the DBase (refreshed) => " + eachUser); usersList.add(eachUser); } } users = usersList.toArray(new User[0]); applyCurrentQuery(); log.info("< updateUserInExistingList"); }
-
2. Re: DataModel
tony.herstell1 Feb 10, 2007 3:24 PM (in response to vk101)Naturally I had to do similar thing for the Create and Delete too.
/*
* Used by external rountines to update the session users list object.
*/
public void addUserToExistingList(User user);
public void updateUserInExistingList(User user);
public void deleteUserFromExistingList(User user); -
3. Re: DataModel
tony.herstell1 Feb 10, 2007 3:26 PM (in response to vk101)Only a guess, but if you are in the same bean you might try an em.flush?
-
4. Re: DataModel
vk101 Feb 10, 2007 5:46 PM (in response to vk101)em.flush() doesn't work. It still gives the same problem.
What could be causing another refresh to be necessary? After the redirect in pages.xml, shouldn't that take care of the refresh? -
5. Re: DataModel
gavin.king Feb 10, 2007 5:49 PM (in response to vk101)What scope is the DataModel. If it is conversation scope, nothing you do to the database is going to be reflected until you update the DataModel itself!
-
6. Re: DataModel
vk101 Feb 10, 2007 6:16 PM (in response to vk101)It's only specified as @DataModel right now. If I try putting an @DataModel(scope=ScopeType.something), it gives an error saying it can only be ScopeType.UNSPECIFIED or ScopeType.PAGE.
ScopeType.UNSPECIFIED gives identical behavior to having just @DataModel (with no scope), and ScopeType.PAGE gives some very weird behavior. Should it be ScopeType.PAGE or something else?
Completely confused... -
7. Re: DataModel
gavin.king Feb 10, 2007 6:25 PM (in response to vk101)What I'm trying to tell you is that you have to update the DataModel when you change the data.
Just like the booking demo does. -
8. Re: DataModel
vk101 Feb 11, 2007 1:39 AM (in response to vk101)That makes sense (and works). Thanks.
I have two DataModelSelections for two DataModels on the same SFSB. When I select one table, the DataModelSelection for that gets properly injected, but the other gets injected with null values (and an id of 0).
Why is something (albeit a null value) getting injected into the DataModelSelection that I didn't select? This is causing problems when I do a #{empty selectedEntity} to check whether the OTHER entity (the one I didn't select) has been injected.
It returns FALSE because it has been injected when it shouldn't have been!
Why is a "null entity" getting injected into DataModelSelection? Is this expected behavior? If not, what might be causing it? -
9. Re: DataModel
vk101 Feb 12, 2007 12:15 PM (in response to vk101)What I'm trying to tell you is that you have to update the DataModel when you change the data.
That works (i.e. calling the factory method to update the DataModel) when the Factory method grabs results from the database. But I have a Factory that grabs results from another entity that has just been updated.
My DataModel is a collection of entities from another entity. e.g. myA.getCollectionOfBs(). My remove method from the DataModel does the following:em.remove(b); // em.flush(); runFactory();
runFactory() simply does a myA.getCollectionOfBs(), which returns the same set of entities (not removing the entity I just got rid of). I tried doing a flush where I've commented it out above, but that didn't help.
What can I do to get these changes reflected? (Short of just doing a query...shouldn't I be able to get them straight from the entities?) -
10. Re: DataModel
gavin.king Feb 12, 2007 12:23 PM (in response to vk101)You are supposed to remove an entity instance from in-memory associations before deleting it.