【发布时间】:2015-03-09 12:24:57
【问题描述】:
我的模型包含 Student 和 Course 类(见下文)。
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 应用程序中添加、删除和编辑Students和Courses。
如您所见,连接表 StudentCourse 是由 JPA 自动创建的。我现在希望能够将已经创建和持久化的 Courses 添加到已经创建和持久化的 Students 中,以便 Students 可以注册任意数量课程。参考将存储在我的 MySQL 数据库中的 StudentCourse 表中。
创建一个连接表是个好主意,还是应该创建一个模型类StudentCourse和一个控制器StudentCourseController来解决问题?
【问题讨论】:
-
请考虑将业务逻辑迁移到容器管理事务可用的自己的位置,因此,您不必手动使用 bean 管理事务。你真的不喜欢那个地方吗? :)
-
从来没想过。但在我的项目中,它是使用托管 Bean 的规范。
-
每个问题请问一个问题。
标签: java hibernate jsf jakarta-ee jpa