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,所以应该手动去数据库中,修改表的结构

你可能感兴趣的:(Hibernate)