Hibernate Student_Course_Score设计

王朝学院·作者佚名  2016-05-29
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Hibernate Student_Course_Score设计示例:

设计代码,实现在数据库中建student表、course表、和score表,展现三者关系

student表:id、name

course表:id、name

score表:id、score、student_id、course_id

三张表的关联关系如下:

设计思路:

1.首先创建Student实体类和Course实体类

会自动创建中间表,通过@JoinTable注解,设置中间表名为“score”,属性名分别为“student_id”和“course_id”

@ManyToMany@JoinTable(name="score", joinColumns={@JoinColumn(name="student_id")}, inverseJoinColumns={@JoinColumn(name="course_id")})

2.创建实体类Score

    PRivate int id;     private int score;     private Student student;     private Course course;

根据步骤1中创建的中间表,通过@Table注解设置表名为“score”,

通过@ManyToOne注解设置属性名分别为“student_id”和“course_id”

3.Junit测试类

@Testpublic void test() { new SchemaExport(new Configuration().configure()).create(true, true);}

 

具体实现代码如下:

1.Student类

@Entitypublic class Student {private int id;private String name;private Set<Course> courses = new HashSet<Course>();@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;}@ManyToMany@JoinTable(name="score", //中间表名joinColumns={@JoinColumn(name="student_id")}, //属性名inverseJoinColumns={@JoinColumn(name="course_id")}) //属性名public Set<Course> getCourses() {return courses;}public void setCourses(Set<Course> courses) {this.courses = courses;}}

2.Course类

@Entitypublic class Course {private int id;private String name;@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;}}

3.Score类

@Entity@Table(name="score") //对应中间表名public class Score {private int id;private int score;private Student student;private Course course;@Id@GeneratedValuepublic 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;}}

4.存储一条数据

@Testpublic void testsave() {session session = sf.getCurrentSession();session.beginTransaction();Student s = new Student();s.setName("lisi");Course c = new Course();c.setName("c++");Score score = new Score();score.setStudent(s);score.setCourse(c);//score.setScore(90); //若不设置,默认为0session.save(s);session.save(c);session.save(score);session.getTransaction().commit();}

注意:

create table score (id integer not null, score integer not null, course_id integer, student_id integer not null auto_increment, primary key (student_id, course_id)) 运行程序,会发现通过程序自动建的score表是有问题的。 我们想要的是,id为主键,且自增 而结果是,student_id和course_id为联合主键,且student_id自增 这是hibernate自身的bug,所以应该手动去数据库中,修改表的结构

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航