Hibernate 再接触 树状结构设计以及学生课程成绩表的设计
1 树状结构的设计
package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @Entity public class Org { private int id; private String name; private Set<Org> children = new HashSet<Org>(); private Org parent; @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; } @OneToMany(cascade=CascadeType.ALL, mappedBy="parent") public Set<Org> getChildren() { return children; } public void setChildren(Set<Org> children) { this.children = children; } @ManyToOne @JoinColumn(name="parent_id") public Org getParent() { return parent; } public void setParent(Org parent) { this.parent = parent; } }
@Test public void testSave() { Org o = new Org(); o.setName("总公司"); Org o1 = new Org(); o1.setName("分公司1"); Org o2 = new Org(); o2.setName("分公司2"); Org o11 = new Org(); o11.setName("分公司1下部门1"); Org o12 = new Org(); o12.setName("分公司1下部门2"); o.getChildren().add(o1); o.getChildren().add(o2); o1.getChildren().add(o11); o1.getChildren().add(o12); o11.setParent(o1); o12.setParent(o1); o1.setParent(o); o2.setParent(o); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(o); session.getTransaction().commit(); session.close(); } @Test public void testLoad() { testSave(); Session session = sessionFactory.openSession(); session.beginTransaction(); Org o = (Org)session.load(Org.class, 1); print(o, 0); session.getTransaction().commit(); session.close(); } private void print(Org o, int level) { //输出 String preStr = ""; for(int i=0; i<level; i++) { //缩进 preStr += "----"; } System.out.println(preStr + o.getName()); for(Org child : o.getChildren()) { print(child, level+1); } }
Course
package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Course { private int id; private String name; @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; } }
score
package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name="score") public class Score { private int id; private int score; private Student student; private Course course; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @ManyToOne @JoinColumn(name="student_id") public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } @ManyToOne @JoinColumn(name="course_id") public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } }
Student
package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Student { private int id; private String name; private Set<Course> courses = new HashSet<Course>(); @ManyToMany @JoinTable(name="score", joinColumns=@JoinColumn(name="student_id", referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="course_id", referencedColumnName="id") ) public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) { this.courses = courses; } @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() { Student s = new Student(); s.setName("zhangsan"); Course c = new Course(); c.setName("java"); Score score = new Score(); score.setCourse(c); score.setStudent(s); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(s); session.save(c); session.save(score); session.getTransaction().commit(); session.close(); } @Test public void testLoad() { testSave(); Session session = sessionFactory.openSession(); session.beginTransaction(); Student s = (Student)session.load(Student.class, 1); for(Course c : s.getCourses()) { System.out.println(c.getName()); } session.getTransaction().commit(); session.close(); }