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测试类

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

 

具体实现代码如下

1.Student类

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

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

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.存储一条数据

@Test
public 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,所以应该手动去数据库中,修改表的结构
posted @ 2014-08-11 21:47  小样儿1020  阅读(656)  评论(0编辑  收藏  举报