您的位置:首页 > 其它

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

2016-10-02 12:05 393 查看
任务是这样的:

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

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

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

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

Student.java

@Entity
public 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
@GeneratedValue
public 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

@Entity
public class Grade
{
private Course course;
private Student stu;
private int id;
private int score;

@GeneratedValue
@Id
public 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

@Entity
public 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;
@Before
public  void before()
{
AnnotationConfiguration cfg=new AnnotationConfiguration().configure();
new SchemaExport(cfg).create(false, true);
sf=cfg.buildSessionFactory();
}
@After
public void after()
{
sf.close();
}
@Test
public 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

@Entity
public 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
@Entity public class Grade { private Course course; private Student stu; private int id; private int score; @GeneratedValue @Id public 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
@Entity
public class Student {
private String name;
private int id;

@Id
@GeneratedValue
public 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;
}
}
测试类:
@Test
public 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语句,来确定学生学的科目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息