Обновление сущностей с отношением «многие ко многим» - PullRequest
1 голос
/ 06 января 2012

У меня есть 2 класса:

@Entity
public class Student extends User {
    ...
    @ManyToMany(mappedBy = "members", fetch = FetchType.EAGER)
    private Set<Group> groups;
    ...
    public void addGroup(Group group) {
        groups.add(group);
    }
}


@Entity
@Table(name = "Group")
public class Group implements Serializable {
    ...    
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "member_of")
    private Set<Student> members;
    ...    
    public void addMember(Student student) {
        members.add(student);
    }
}

Это сессионный компонент, который управляет их отношениями:

@Stateless
public class StudentManager extends AcademicManager implements StudentManagerRemote {
    ...
    @Override
    public void requestAnswer(long requestID, RequestAnswer answer) {
        Request request = entityManager.find(Request.class, requestID);
        if(answer == RequestAnswer.YES) {
            Student student = request.getStudent();
            Group group = request.getGroup();
            group.addMember(student);
            student.addGroup(group);
            entityManager.flush();
            entityManager.clear();
        }
    }
    ...
}

Не обновляет БД. Зачем? Я делаю то же самое для других отношений, но это единственный вариант ManyToMany, который у меня есть.
Я также пытался с запросом, но не работал.

РЕДАКТИРОВАТЬ: Я отредактировал код, как предложил Mr.J4mes, но он по-прежнему не работает.
Более того: почему .flush () и .clear () не нужны?

1 Ответ

1 голос
/ 06 января 2012

Когда вы звоните group.getMembers(), вы просто получаете копию Set, которая содержит Student от Group сущности.Следовательно, когда вы обновляете его, Set внутри вашей Group сущности не обновляется.У вас есть 2 варианта:

  1. Получить Set от Group и восстановить после обновления:

    Set<Student> members = group.getMembers();
    members.add(student);
    group.setMembers(members);
    
  2. Добавитьметод addStudent внутри сущности Group и метод addGroup внутри сущности Student для вызова в вашем методе requestAnswer.Это будет что-то вроде этого:

    @Entity
    public class Group implements Serializable {
        private Set<Student> members;
    
        public void addMember(Student student) {
           this.members.add(student);
        }
    }
    
    @Stateless
    public class StudentManager extends AcademicManager implements StudentManagerRemote {
        @PersistenceContext
        private EntityManager em;
        ...
        @Override
        public void requestAnswer(long requestID, RequestAnswer answer) {
            Request request = entityManager.find(Request.class, requestID);
            if(answer == RequestAnswer.YES) {
                Student student = request.getStudent();
                Group group = request.getGroup();
                group.addMember(student);
                student.addGroup(group);
            }
        }
        ...
    }
    

Кроме того, вам на самом деле не нужно звонить em.flush() и em.cancel().

...