首页 > 代码库 > Hibernate Student_Course_Score设计

Hibernate Student_Course_Score设计

示例

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

student表:id、name

course表:id、name

score表:id、score、student_id、course_id

三张表的关联关系如下:

2

设计思路

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	@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;	}		@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	@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;	}}

3.Score类

@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;	}	}

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);  //若不设置,默认为0			session.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,所以应该手动去数据库中,修改表的结构