我正在使用PrimeFaces,JPA,Hibernate和JSF 2.0开发Web应用程序。
我有两个实体Students
和Course
具有多对一的关系。
@Entity
@Table(name = "STUDENTS")
public class Students extends MainUsers implements Serializable {
private String firstName;
private String lastName;
private long mobile;
private String jobTitle;
private int duration;
@Temporal(TemporalType.TIMESTAMP)
private Date startDate;
@Temporal(TemporalType.TIMESTAMP)
private Date endDate;
@ManyToOne
@JoinColumn(name = "course_id", nullable = true)
private Course company;
// Getters and setters.
}
@Entity
@Table(name = "COURSE")
@NamedQueries({
@NamedQuery(name = "course.findCourseByCourseId", query = "select c from Course c where c.Id =:id"),
@NamedQuery(name = "course.findCourseByCourseName", query = "select c from Course c where c.courseName =:courseName") })
public class Course implements Serializable {
public static final String FIND_COURSE_BY_COURSE_ID = "course.findByCourseId";
public static final String FIND_COURSE_COURSE_NAME = "course.findByCourseName";
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int Id;
private String courseName;
@OneToMany(targetEntity = Students.class, mappedBy = "course", fetch = FetchType.LAZY)
private List<Students> students;
// Getters and setters.
@Override
public int hashCode() {
return getId();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Course) {
Course course = (Course) obj;
return course.getId() == Id;
}
return false;
}
}
我有一个注册页面,其中包含学生的姓名,电子邮件,密码和课程。选择我使用过的课程
<h:outputText value="Course :" />
<p:selectOneMenu value="#{courseMB.course}">
<f:selectItem itemLabel="Select one Course" itemValue="" />
<f:selectItems value="#{courseMB.allCourses}" var="crs"
itemLabel="#{crs.courseName}" itemValue="#{crs.id}" />
<f:converter converterId = "courseConverter"/>
</p:selectOneMenu>
要创建学生,我在StudentMB课程中有以下方法:
public void createStudent() {
String test = student.getEmail();
if (getStudentFacade().isStudentExist(test)){
System.out.println(test);
} else {
try {
student.setActivation_key(hashKey());
student.setRole(Role.STUDENT);
student.setActive(0);
getStudentFacade().createStudent(student);
displayInfoMessageToUser("Created with success");
SendEmail.Send(username, password, student.getEmail(), title, linkToSend());
loadStudent();
resetStudent();
} catch (Exception e) {
displayErrorMessageToUser("Opps, we could not create the user. Try again");
e.printStackTrace();
}
}
}
我真的不知道如何将课程导入StudentMB并将其保存到数据库中。目前的方法给我一个错误
'null Converter'的转换错误设置值'courseID'。
我尝试使用转换器,但我在参数中得到空字符串。
@FacesConverter(value="courseConverter", forClass = com.model.Course.class)
public class CourseConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
CourseFacade courseFacade = new CourseFacade();
int courseId;
try {
courseId = Integer.parseInt(submittedValue);
} catch (NumberFormatException exception) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Type the name of a Course and select it (or use the dropdown)",
"Type the name of a Course and select it (or use the dropdown)"));
}
return courseFacade.findCourse(courseId);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
Course course = null;
if (modelValue instanceof Course){
course = (Course) modelValue;
StringBuilder asString = new StringBuilder();
asString.append(course.getId()+"-");
asString.append(course.getCourseName());
return asString.toString();
}
return "";
}
}
这是如何引起的?如何解决?
答案 0 :(得分:1)
您需要将选择项值设置为Course
本身,而不是id
。
替换
itemValue="#{crs.id}"
通过
itemValue="#{crs}"
否则转换器只会在#{crs.id}
中获得modelValue
getAsString()
,从而返回一个空字符串。这个空字符串又通过getAsObject()
提交回服务器,这又导致异常。
您应该在ConverterException
的{{1}}部分中抛出else
,以便立即清楚转换器不适合给定的模型值。