示例:
設計代碼,實現在數據庫中建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,所以應該手動去數據庫中,修改表的結構
新聞熱點
疑難解答