Issue Details (XML | Word | Printable)

Key: APF-695
Type: Improvement Improvement
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Bryan Noll
Reporter: Bryan Noll
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
AppFuse

Fix the way EntityManager.merge is being used and get rid of the DaoUtils class

Created: 13/Mar/07 06:22 PM   Updated: 28/Mar/07 12:46 PM   Resolved: 28/Mar/07 11:51 AM
Component/s: Persistence Layer
Affects Version/s: 2.0-M3
Fix Version/s: 2.0-M5

File Attachments: 1. Text File data.patch (17 kB)
2. Text File service.patch (11 kB)
3. Text File web.patch (5 kB)




Bryan Noll made changes - 13/Mar/07 06:22 PM
Field Original Value New Value
Status Open [ 1 ] In Progress [ 3 ]
Bryan Noll added a comment - 13/Mar/07 07:34 PM
So, here's the patch so those interested can take a look at it. The real pain here is that these changes, while simple, do bubble up to the manager and web tiers.

This happens because the paradigm changes from this:

dao.save(o); //where o is guaranteed to get the new persistent state copied onto it

...to this:

o = dao.save(o); //the 'o = ' part is now required to ensure that o has the correct state


The plan is to wait until 2.0 final to do this though.

Bryan Noll made changes - 13/Mar/07 07:34 PM
Attachment data.patch [ 10302 ]
Bryan Noll added a comment - 13/Mar/07 07:43 PM
To give you a more precise idea of what exactly will have to change:

bnoll@baitshop:~/projects/oss/appfuse-2/service$ find ./src/main/ -name \*.java | grep -v svn | xargs grep --color "\.save"
./src/main/java/org/appfuse/service/impl/UniversalManagerImpl.java: dao.save(o);
./src/main/java/org/appfuse/service/impl/GenericManagerImpl.java: genericDao.save(object);
./src/main/java/org/appfuse/service/impl/UserManagerImpl.java: dao.saveUser(user);
./src/main/java/org/appfuse/service/impl/RoleManagerImpl.java: dao.save(role);


bnoll@baitshop:~/projects/oss/appfuse-2/web$ find . -name \*.java | grep -v svn | grep -v target | xargs grep --color "\.save"
./spring/src/main/java/org/appfuse/webapp/controller/UserFormController.java: getUserManager().saveUser(user);
./spring/src/main/java/org/appfuse/webapp/controller/UserFormController.java: saveMessage(request, getText("user.saved", user.getFullName(), locale));
./spring/src/main/java/org/appfuse/webapp/controller/SignupController.java: this.getUserManager().saveUser(user);
./jsf/src/test/java/org/appfuse/webapp/action/UserFormTest.java: assertEquals(bean.save(), "mainMenu");
./jsf/src/test/java/org/appfuse/webapp/action/SignupFormTest.java: assertEquals(bean.save(), "mainMenu");
./jsf/src/main/java/org/appfuse/webapp/action/UserForm.java: userManager.saveUser(user);
./jsf/src/main/java/org/appfuse/webapp/action/UserForm.java: addMessage("user.saved");
./jsf/src/main/java/org/appfuse/webapp/action/SignupForm.java: userManager.saveUser(user);
./struts/src/test/java/org/appfuse/webapp/action/SignupActionTest.java: assertEquals(action.save(), "success");
./struts/src/test/java/org/appfuse/webapp/action/UserActionTest.java: assertEquals(action.save(), "input");
./struts/src/test/java/org/appfuse/webapp/action/UserActionTest.java: assertEquals("input", action.save());
./struts/src/main/java/org/appfuse/webapp/action/SignupAction.java: userManager.saveUser(user);
./struts/src/main/java/org/appfuse/webapp/action/BaseAction.java: this.save = save;
./struts/src/main/java/org/appfuse/webapp/action/UserAction.java: userManager.saveUser(user);
./struts/src/main/java/org/appfuse/webapp/action/UserAction.java: saveMessage(getText("user.saved"));
./tapestry/src/test/java/org/appfuse/webapp/pages/UserFormTest.java: ILink link = page.save(new MockRequestCycle());
./tapestry/src/test/java/org/appfuse/webapp/pages/SignupFormTest.java: page.save(new MockRequestCycle());
./tapestry/src/main/java/org/appfuse/webapp/pages/UserForm.java: userManager.saveUser(user);
./tapestry/src/main/java/org/appfuse/webapp/pages/UserForm.java: nextPage.setMessage(getText("user.saved", user.getFullName()));
./tapestry/src/main/java/org/appfuse/webapp/pages/SignupForm.java: getUserManager().saveUser(user);

Bryan Noll added a comment - 13/Mar/07 07:45 PM
The second find from above isn't quite right and makes it look worse than it really is. Only manager.save*** calls will be affected so lines with things like "user.saved" and "bean.save()" can be ignored.

Bryan Noll added a comment - 14/Mar/07 10:25 AM
Attaching the patch for the service module. Still need to create the patch for the web module.

Bryan Noll made changes - 14/Mar/07 10:25 AM
Attachment service.patch [ 10303 ]
Matt Raible added a comment - 14/Mar/07 10:34 AM
While you're in there digging around, can you check and see if it's possible to *not* return an object from the save() method? I know it's used in tests, but I don't know if it's used in the web tier. If it's not used in the web tier, you should just be able to call the method w/o re-assigning the returned variable. If we're never using the returned value or primary key in our application logic, it makes sense to not return it. iBATIS currently requires custom SQL for each database type to get the inserted id, and things would be a lot more portable if we didn't have to worry about that.

Bryan Noll added a comment - 15/Mar/07 01:10 PM
Here's the patch for the web tier. After the m4 release, I can apply these and commit the changes if everyone thinks that's the best way to go.

In response to Matt's comment, I see what you're saying regarding the pain it creates with iBatis... but it seems important to me to have the ability to have a live reference to the object you just saved. I'd rather a person have access to it and not use it, then not have access at all. If we don't give access to it at all, I'll bet we have someone ask for it sooner or later.

Bryan Noll made changes - 15/Mar/07 01:10 PM
Attachment web.patch [ 10304 ]
2603 by  Bryan Noll (46 files)
28/Mar/07 11:50 AM (40 months, 14 days ago)
fix for APF-695
appfuse: trunk/data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java 2603 history download (+2 -8) diffs
appfuse: trunk/data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java 2603 history download (+2 -2) diffs
appfuse: trunk/data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java 2603 history download (+3 -2) diffs
appfuse: trunk/data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java 2603 history download (+2 -8) diffs
appfuse: trunk/service/src/main/java/org/appfuse/service/impl/UniversalManagerImpl.java 2603 history download (+2 -2) diffs
appfuse: trunk/data/ibatis/src/test/java/org/appfuse/dao/UserDaoTest.java 2603 history download (+6 -6) diffs
appfuse: trunk/data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java 2603 history download (+1 -1) diffs
appfuse: trunk/web/tapestry/src/main/java/org/appfuse/webapp/pages/SignupForm.java 2603 history download (+1 -1) diffs
appfuse: trunk/web/spring/src/main/java/org/appfuse/webapp/controller/SignupController.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java 2603 history download (+2 -2) diffs
appfuse: trunk/service/src/test/java/org/appfuse/service/impl/UniversalManagerTest.java 2603 history download (+3 -3) diffs
appfuse: trunk/service/src/main/java/org/appfuse/service/impl/RoleManagerImpl.java 2603 history download (+2 -2) diffs
appfuse: trunk/data/hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java 2603 history download (+3 -1) diffs
appfuse: trunk/data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java 2603 history download (+5 -4) diffs
appfuse: trunk/service/src/test/java/org/appfuse/service/UserExistsExceptionTest.java 2603 history download (+1 -1) diffs
appfuse: trunk/web/jsf/src/main/java/org/appfuse/webapp/action/SignupForm.java 2603 history download (+1 -1) diffs
appfuse: trunk/web/struts/src/main/java/org/appfuse/webapp/action/SignupAction.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java 2603 history download (+1 -1) diffs
appfuse: trunk/service/src/main/java/org/appfuse/service/impl/UserManagerImpl.java 2603 history download (+2 -2) diffs
appfuse: trunk/service/src/test/java/org/appfuse/service/UserSecurityAdviceTest.java 2603 history download (+7 -7) diffs
appfuse: trunk/service/src/main/java/org/appfuse/service/RoleManager.java 2603 history download (+1 -1) diffs
appfuse: trunk/web/jsf/src/main/java/org/appfuse/webapp/action/UserForm.java 2603 history download (+1 -1) diffs
appfuse: trunk/service/src/main/java/org/appfuse/service/impl/GenericManagerImpl.java 2603 history download (+2 -2) diffs
appfuse: trunk/web/spring/src/main/java/org/appfuse/webapp/controller/UserFormController.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java 2603 history download (+2 -2) diffs
appfuse: trunk/data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java 2603 history download (+1 -1) diffs
appfuse: trunk/data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java 2603 history download (+2 -2) diffs
...16 more files in changeset

Bryan Noll added a comment - 28/Mar/07 11:51 AM
Committed revision 2603.

Still need to get the implications of this fix in the release notes here: http://appfuse.org/display/APF/Release+Notes+2.0+M5

Bryan Noll made changes - 28/Mar/07 11:51 AM
Fix Version/s 2.0-M5 [ 10141 ]
Fix Version/s 2.0 Final [ 10113 ]
Status In Progress [ 3 ] Resolved [ 5 ]
Resolution Fixed [ 1 ]
2604 by  Bryan Noll (2 files)
28/Mar/07 12:22 PM (40 months, 14 days ago)
Bryan Noll added a comment - 28/Mar/07 12:46 PM
Release notes have been updated.