How to delete relations in entities, id´s are not the
nschweig Dec 18, 2008 7:01 AMHi,
I have a webapplication with jsf and ejb.If I try to delete relations between entities I always run into the same problem. The id of the objects are not the same so I can delete them from the list.
For example:
Relation Course/CmtUser
Course.java
@ManyToMany(fetch=FetchType.EAGER) @IndexColumn(name="INDEX_COL") private List<CmtUser> participants = new ArrayList<CmtUser>();
CmtUser.java
@ManyToMany(mappedBy="members", fetch=FetchType.EAGER) @IndexColumn(name="INDEX_COL") private List <CmtGroup> groups = new ArrayList<CmtGroup>();
Joining a course is not the problem:
JSF-managedbean CourseBean:
public void joinCourse(){ currentUser = userHandler.getCmtUserByUserName(getRemoteUserName()); courseHandler.joinCourse(getCurrentCourseId(),currentUser); }
But if I try to "leave a course" (delete user from course-participant-list) it does not work.
I tried it in several ways:
1. Way
The managedbean CourseBean invokes the handler and gives the objects to it:
public void leaveCourse(){ courseHandler.leaveCourse(currentCourse, currentUser); }
Then in the handler I tried to remove the user from the course and vice versa
public void leaveCourse(Course c, CmtUser user) { c.getParticipants().remove(user); user.getCourses().remove(c); em.merge(c); em.merge(user); }
Problem: Cannot remove the user from c. participants because the id from the user I not the same as the user in the list participants.
The same problem in the 2. Way
2. Way
The managedbean CourseBean invokes the handler:
public void leaveCourse(){ courseHandler.leaveCourse(currentCourse.getId(), currentUser.getId()); }
CourseHandler.java
public void leaveCourse(Long courseId, Long userId) { Course course = getCourse(courseId); CmtUser user = userHandler.getCmtUser(userId); course.getParticipants().remove(user); user.getCourses().remove(course); em.merge(user); em.merge(course); }
If I look into course.participants the id from the user in it is another than the id from the user I got with my userHandler with userHandler.getCmtUser(userId);.
3. Way:
I remove the elements from the list in the jsfmanagedbean CourseBean:
public void leaveCourse(){ currentCourse.getParticipants().remove(currentUser); currentUser.getCourses().remove(currentCourse); courseHandler.updateCourse(currentCourse); userHandler.updateUser(currentUser); }
The only thing I do in the ejbhandler is to update the objects:
CourseHandler.java
public void updateCourse(Course course) { em.merge(course); }
UserHandler.java
public void updateUser(CmtUser cmtUser) { em.merge(cmtUser); }
But it is the same problem.
How do I solve this? Which is the best way to implement this things; in the jsfmanagedbean or in the ejbhandlers?
Please I need your help.
Thanks Nicki