【问题标题】:Persisting in joined tables with JPA and JSF坚持使用 JPA 和 JSF 连接表
【发布时间】:2015-03-09 12:24:57
【问题描述】:

我的模型包含 StudentCourse 类(见下文)。

Student.java

@NamedQueries({ @NamedQuery(name = "SelectStudents", query = "SELECT s FROM Student s"), })
@Entity
public class Student implements Serializable {

    private static final long serialVersionUID = -8776005542073703016L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Size(min = 3, max = 30)
    private String firstName;

    @Size(min = 3, max = 30)
    private String lastName;

    @Temporal(TemporalType.DATE)
    @Past
    private Date dateOfBirth;

    private String email;

    @Size(min = 5, max = 5)
    private String regNr;

    private String faculty;

    @ManyToMany
    @JoinTable(name = "StudentCourse", joinColumns = { 
            @JoinColumn(name = "student_id", referencedColumnName = "id") }, inverseJoinColumns = { 
            @JoinColumn(name = "course_id", referencedColumnName = "id") })
    private List<Course> courses;

    public Student() {
    }

    // getter and setter
}

Course.java

@NamedQueries({
        @NamedQuery(name = "SelectCourses", query = "SELECT c FROM Course c"),
        @NamedQuery(name = "SelectStudentCoursesByName", query = "SELECT c FROM Course c WHERE c.name = :name") })
@Entity
public class Course implements Serializable {

    private static final long serialVersionUID = -5955154651849644853L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    private int cp;

    public Course() {
    }
    // getter and setter
}

控制器如下所示。

StudentController.java

@ManagedBean(name = "studentController")
@SessionScoped
public class StudentController {

    private DataModel<Student> students;

    private Student student = new Student();

    @Resource
    private UserTransaction utx;

    @PersistenceContext
    private EntityManager em;

    @PostConstruct
    public void init() {
        students = new ListDataModel<Student>();
        students.setWrappedData(em.createNamedQuery("SelectStudents")
                .getResultList());
    }

    public String newStudent() {
        this.student = new Student();
        return "newStudent?faces-redirect=true";
    }

    public String saveStudent() {
        try {
            utx.begin();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        student = em.merge(student);
        em.persist(student);
        students.setWrappedData(em.createNamedQuery("SelectStudents")
                .getResultList());
        try {
            utx.commit();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RollbackException e) {
            e.printStackTrace();
        } catch (HeuristicMixedException e) {
            e.printStackTrace();
        } catch (HeuristicRollbackException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        return "studentList";
    }

    public String deleteStudent() {
        try {
            utx.begin();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        student = students.getRowData();
        // Transaktionsbeginn
        student = em.merge(student);
        em.remove(student);
        students.setWrappedData(em.createNamedQuery("SelectStudents")
                .getResultList());
        try {
            utx.commit();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RollbackException e) {
            e.printStackTrace();
        } catch (HeuristicMixedException e) {
            e.printStackTrace();
        } catch (HeuristicRollbackException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        return "studentList?faces-redirect=true";
    }

    public String editStudent() {
        student = students.getRowData();
        return "newStudent";
    }
    // getter and setter
}

CourseController.java

@ManagedBean
@SessionScoped
public class CourseController {

    private DataModel<Course> courses;

    private Course course;

    @Resource
    private UserTransaction utx;

    @PersistenceContext
    private EntityManager em;

    @PostConstruct
    public void init() {
        courses = new ListDataModel<Course>();
        courses.setWrappedData(em.createNamedQuery("SelectCourses")
                .getResultList());
    }

    public String newCourse() {
        this.course = new Course();
        return "newCourse?faces-redirect=true";
    }

    public String saveCourse() {
        try {
            utx.begin();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        course = em.merge(course);
        em.persist(course);
        courses.setWrappedData(em.createNamedQuery("SelectCourses")
                .getResultList());
        try {
            utx.commit();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RollbackException e) {
            e.printStackTrace();
        } catch (HeuristicMixedException e) {
            e.printStackTrace();
        } catch (HeuristicRollbackException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        return "courseList?faces-redirect=true";
    }

    public String deleteCourse() {
        try {
            utx.begin();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        course = courses.getRowData();
        // Transaktionsbeginn
        course = em.merge(course);
        em.remove(course);
        courses.setWrappedData(em.createNamedQuery("SelectCourses")
                .getResultList());
        try {
            utx.commit();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RollbackException e) {
            e.printStackTrace();
        } catch (HeuristicMixedException e) {
            e.printStackTrace();
        } catch (HeuristicRollbackException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
        return "courseList?faces-redirect=true";
    }

    public String editCourse() {
        course = courses.getRowData();
        return "newCourse?faces-redirect=true";
    }
    // getter and setter
}

我已经创建了 JSF 页面,并且可以在我的 Java EE 应用程序中添加、删除和编辑StudentsCourses

如您所见,连接表 StudentCourse 是由 JPA 自动创建的。我现在希望能够将已经创建和持久化的 Courses 添加到已经创建和持久化的 Students 中,以便 Students 可以注册任意数量课程。参考将存储在我的 MySQL 数据库中的 StudentCourse 表中。

创建一个连接表是个好主意,还是应该创建一个模型类StudentCourse和一个控制器StudentCourseController来解决问题?

【问题讨论】:

  • 请考虑将业务逻辑迁移到容器管理事务可用的自己的位置,因此,您不必手动使用 bean 管理事务。你真的不喜欢那个地方吗? :)
  • 从来没想过。但在我的项目中,它是使用托管 Bean 的规范。
  • 每个问题请问一个问题。

标签: java hibernate jsf jakarta-ee jpa


【解决方案1】:

对于您的问题描述的连接表就足够了,但是如果您稍后想要添加属性,例如他们获得的成绩,那么您将需要一个额外的实体类来对关系建模。

【讨论】:

  • 该课程确实有学分,你是这个意思吗?它不仅仅是一个名字。另一个问题是,如何为学生保留课程以及如何通过 JSF 访问它?我还没有那么多经验。 :(
猜你喜欢
  • 2012-04-23
  • 2017-06-25
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多