hibernate3.3.2学习笔记--- 一个小实例

来源:互联网 发布:透明计算造假 知乎 编辑:程序博客网 时间:2024/06/17 01:05

任务是这样的:

在数据库建三张表,第一张关于学生,第二张关于成绩,第三张关于课程。

一个学生有多项成绩,一个学生选多个课程。

一项成绩里有一个学生,一项成绩里有一门课程,还有一个成绩(int)。

一个课程可被多个学生选择。


Student.java

@Entitypublic class Student {private String name;    private int id;    private Set<Course>courses=new HashSet<Course>();    private Set<Grade>grades=new HashSet<Grade>();           @ManyToMany(cascade=CascadeType.ALL)public Set<Course> getCourses() {return courses;}public void setCourses(Set<Course> courses) {this.courses = courses;}@OneToMany(cascade=CascadeType.ALL)public Set<Grade> getGrades() {return grades;}public void setGrades(Set<Grade> grades) {this.grades = grades;}@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
Grade.java

@Entitypublic class Grade {private Course course;private Student stu;private int id;private int score;@GeneratedValue@Idpublic int getId() {return id;}@OneToOne(cascade=CascadeType.ALL)public Course getCourse() {return course;}public void setCourse(Course course) {this.course = course;}@OneToOne(cascade=CascadeType.ALL)public Student getStu() {return stu;}public void setStu(Student stu) {this.stu = stu;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void setId(int id) {this.id = id;}}
Course.java

@Entitypublic class Course {private String courseName;private Set<Student>students=new HashSet<Student>();   private int id;      @Id   @GeneratedValue   public int getId() { return id;   }  public void setId(int id) {this.id = id;  }      public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}@OneToMany(cascade=CascadeType.ALL,mappedBy="courses")public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
测试类:

public class Many2Many {SessionFactory sf=null;@Beforepublic  void before(){AnnotationConfiguration cfg=new AnnotationConfiguration().configure();      new SchemaExport(cfg).create(false, true);     sf=cfg.buildSessionFactory();}@Afterpublic void after(){sf.close();}@Testpublic void TestSave(){Session sess=sf.getCurrentSession();sess.beginTransaction();Student st=new Student();Student st2=new Student();Grade gr=new Grade();Grade gr2=new Grade();Grade gr3=new Grade();Grade gr4=new Grade();Course co=new Course();Course co2=new Course();st.setName("st1");st2.setName("st2");co.setCourseName("co1");co2.setCourseName("co2");co.setId(1);co2.setId(2);gr.setCourse(co);gr.setStu(st);gr.setScore(90);gr2.setCourse(co2);gr2.setStu(st);gr2.setScore(80);gr3.setCourse(co);gr3.setStu(st2);gr3.setScore(70);gr4.setCourse(co2);gr4.setStu(st2);gr4.setScore(60);st.getGrades().add(gr);st.getGrades().add(gr2);st.getGrades().add(gr3);st.getGrades().add(gr4);st.getCourses().add(co);st.getCourses().add(co2);st2.getCourses().add(co);st2.getCourses().add(co2);co.getStudents().add(st);co.getStudents().add(st2);co2.getStudents().add(st);co2.getStudents().add(st2);sess.save(st);sess.save(st2);sess.getTransaction().commit();}}

然而实际上,推荐这样写:

Course.java

@Entitypublic class Course {private String courseName;   private int id;      @Id   @GeneratedValue   public int getId() { return id;   }  public void setId(int id) {this.id = id;  }      public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}}
Grade.java

@Entitypublic class Grade {private Course course;private Student stu;private int id;private int score;@GeneratedValue@Idpublic int getId() {return id;}@OneToOne(cascade=CascadeType.ALL)public Course getCourse() {return course;}public void setCourse(Course course) {this.course = course;}@OneToOne(cascade=CascadeType.ALL)public Student getStu() {return stu;}public void setStu(Student stu) {this.stu = stu;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void setId(int id) {this.id = id;}}
Student.java

@Entitypublic class Student {private String name;    private int id;@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
测试类:

@Testpublic void TestSave(){Session sess=sf.getCurrentSession();sess.beginTransaction();Student st=new Student();Student st2=new Student();Grade gr=new Grade();Grade gr2=new Grade();Grade gr3=new Grade();Grade gr4=new Grade();Course co=new Course();Course co2=new Course();st.setName("st1");st2.setName("st2");co.setCourseName("co1");co2.setCourseName("co2");co.setId(1);co2.setId(2);st.setId(1);st2.setId(2);gr.setCourse(co);gr.setStu(st);gr.setScore(90);gr2.setCourse(co2);gr2.setStu(st);gr2.setScore(80);gr3.setCourse(co);gr3.setStu(st2);gr3.setScore(70);gr4.setCourse(co2);gr4.setStu(st2);gr4.setScore(60);sess.save(st);sess.save(st2);sess.save(co);sess.save(co2);sess.save(gr);sess.save(gr2);sess.save(gr3);sess.save(gr4);         sess.getTransaction().commit();}

总结下:就是说,在映射的过程中,根据需求,写出映射关系,不一定非要导航,从学生直接导航到课程,,,

导航只是为了编码方便,不用导航,也可以直接通过QL语句,来确定学生学的科目。




0 0
原创粉丝点击