1

PrimeFaces、JPA、Hibernate、および JSF 2.0 を使用して Web アプリケーションに取り組んでいます。

2 つのエンティティがStudentsありCourse、多対 1 の関係があります。

@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 コンバーター」の変換エラー設定値「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 "";
    }

}

これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

1

Course選択項目の値を、その ではなく、それ自体に設定する必要がありますid

交換

itemValue="#{crs.id}"

itemValue="#{crs}"

そうしないと、コンバーターは#{crs.id}as modelValueinのみを取得しgetAsString()、空の文字列を返します。この空の文字列はサーバーに送信さgetAsObject()れ、それによって例外が発生します。

コンバーターが指定されたモデル値に適していないことがすぐにわかるようConverterExceptionに、のelse部分にa をスローする必要があります。if (modelValue instanceof Course)

以下も参照してください。

于 2012-12-01T17:30:37.080 に答える