Только первая commandLink в dataTable кликабельна

Я новичок в JPA, и я пытаюсь создать форму данных, позволяющую вам нажать "Удалить", чтобы удалить пользователя из курса. Проблема в том, что только первый (самый верхний) из таблицы данных доступен для клика и удаляет курс у этого пользователя. (Когда он удален, следующий в списке теперь самый верхний и рабочий.)

Проблема в том, что другие ссылки (все, кроме самых верхних) обновляют сайт без параметров URL (сброс сеанса?) И не вызывают метод removeUserFromCourse(..). Если кто-нибудь знает, почему это происходит, пожалуйста, не стесняйтесь отвечать и указывать на мои ошибки.

Контроллер (укороченный):

@Model
public class UserController{
    private UserDAO persister;
    private User user;
    // 103 is just a default value
    private int selectedID = 103;

    @Inject
    public UserController(UserDAO persister) {
        this.persister = persister;
    }

    @PostConstruct
    public void init() {
        this.user = new User();
    }

    public int getSelectedID() {
        return selectedID;
    }

    public void setSelectedID(int selectedID) {
        this.selectedID = selectedID;
    }

    public void removeUserFromCourse(int courseID){
        persister.removeFromCourse(selectedID, courseID);
        user = persister.getUser(selectedID);
    }
}

Форма в edit-user.xhtml:

         <h:form>
            <h:dataTable id="mdtb" value="#{userController.getUserCourses()}" var="course"
                         styleClass=" col-lg-6">
                <h:column>
                    <h:outputText value="#{course.name} (#{course.id})" styleClass="col-lg-6"/>
                    <h:commandLink update="mdtb" value="Remove"
                                   action="#{userController.removeUserFromCourse(course.id)}">
                        <f:param name="id" value="#{userController.selectedID}"/>
                    </h:commandLink>
                </h:column>
            </h:dataTable>
        </h:form>

Пользователь JPA (сокращенно):

@Stateless
public class JPAUserDao implements UserDAO {
    EntityManagerFactory entityManagerFactory;
    @PersistenceContext(name = "Egentreningprosjekt")
    EntityManager entityManager;

    public JPAUserDao() {
    }

    public JPAUserDao(EntityManager entityManager){
        this.entityManager = entityManager;
    }

    @Override
    public User update(User user) {
        System.out.println("updating user " + user);
        entityManager.merge(user);
        return user;
    }

    @Override
    public void removeFromCourse(int userID, int courseID) {
        User user = getUser(userID);
        List<Course> courses = user.getCourses();
        Course courseToBeDeleted = null;

        for(Course course : courses){
            if(course.getId() == courseID){
                courseToBeDeleted = course;
            }
        }

        if(courseToBeDeleted != null){
            courses.remove(courseToBeDeleted);
            courseToBeDeleted.getUsers().remove(user);
        }

        user.setCourses(courses);
        update(user);
        entityManager.merge(courseToBeDeleted);
    }

User.java (сокращенно):

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Min(value = 0, message = "ID cannot be negative")
    private int id;

    @NotNull
    @Pattern(regexp = "^([A-Z|a-z|0-9](\\.|_){0,1})+[A-Z|a-z|0-9]\\@([A-Z|a-z|0-9])+((\\.){0,1}[A-Z|a-z|0-9]){2}\\.[a-z]{2,3}$")
    private String email;

    @ManyToMany(mappedBy = "users", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    private List<Course> courses;

    // getters/setters
}

0 ответов

Отвечаю на это сейчас, 4 года спустя. Это произошло из-за того, что 103 был жестко закодирован, как намекали в комментариях.

Другие вопросы по тегам