Java 只有dataTable中的第一个commandLink是可单击的

Java 只有dataTable中的第一个commandLink是可单击的,java,jsf,jakarta-ee,datatable,Java,Jsf,Jakarta Ee,Datatable,我是JPA新手,我正在尝试制作一个datatable表单,允许您按“删除”键从课程中删除用户。问题是,只有datatable中的第一个(最上面的)是可单击的,并从该用户处删除课程。(删除后,列表中的下一个现在是最上面的,并且正在工作。) 问题在于,其他链接(除最上面的链接外的所有链接)正在刷新没有URL参数的站点(重置会话?),并且没有调用removeUserFromCourse(..)方法。如果有人知道为什么会这样,请随时回答并指出我的错误 控制器(简称): edit-user.xhtml中

我是JPA新手,我正在尝试制作一个datatable表单,允许您按“删除”键从课程中删除用户。问题是,只有datatable中的第一个(最上面的)是可单击的,并从该用户处删除课程。(删除后,列表中的下一个现在是最上面的,并且正在工作。)

问题在于,其他链接(除最上面的链接外的所有链接)正在刷新没有URL参数的站点(重置会话?),并且没有调用removeUserFromCourse(..)方法。如果有人知道为什么会这样,请随时回答并指出我的错误

控制器(简称):

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(简称):

@无状态
公共类JPAUserDao实现UserDAO{
实体管理工厂实体管理工厂;
@PersistenceContext(name=“egentrengprosjekt”)
实体管理器实体管理器;
公共图书馆{
}
公共JPAUserDao(实体管理器实体管理器){
this.entityManager=entityManager;
}
@凌驾
公共用户更新(用户){
System.out.println(“更新用户”+用户);
entityManager.merge(用户);
返回用户;
}
@凌驾
public void removeFromCourse(int userID,int courseID){
User=getUser(userID);
List courses=user.getCourses();
课程courseToBeDeleted=null;
用于(课程:课程){
if(course.getId()==courseID){
courseToBeDeleted=课程;
}
}
if(courseToBeDeleted!=null){
课程。删除(课程删除);
courseToBeDeleted.getUsers().remove(用户);
}
用户设置课程(课程);
更新(用户);
entityManager.merge(课程删除);
}
User.java(缩写):

@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE)
@最小值(值=0,消息=“ID不能为负”)
私有int-id;
@NotNull
@模式(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$”)
私人字符串电子邮件;
@ManyToMany(mappedBy=“users”,cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER)
私人名单课程;
//能手/二传手
}

四年后现在回答这个问题。这是因为103是硬编码的,正如评论所暗示的那样。

是因为103是硬编码的吗?看起来这导致它总是得到相同的用户。另外,可能是因为它不是ajax调用。它实际上正在提交表单。可能是
         <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>
@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);
    }
@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
}