Только первая 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 был жестко закодирован, как намекали в комментариях.