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