hibernate之关于关联映射的综合应用

【hibernate】之关于关联映射的综合应用

1、关联映射如何处理业务逻辑

2、如何指定中间表

3、如何进行级联操作

4、如何解决Hibenrate建表过程中主键错乱问题

现在有三张表

Student(学生表),Course(课程表),Score(学生,课程,分数,表)

那么我们分析业务逻辑可知,学生和课程是多对多的关系,学生和分数表是一对多的关系,课程和分数也是一对多的关系。

直接看Annotations配置,在这里我所有的配置都是双向关联,这样在分数,课程,学生,之中,可以任意找到彼此!

@Entity@Table(name=”c_course”)publicclassCourse{privateIntegerid;privateStringcoursename;privateSet<Student>students=newHashSet<Student>();privateSet<Score>scores=newHashSet<Score>();@OneToMany(mappedBy=”course”)//必须指定关系由多的一方维护publicSet<Score>getScores(){returnscores;}publicvoidsetScores(Set<Score>scores){this.scores=scores;}@ManyToMany//指定中间表是s_score@JoinTable(name=”s_score”,joinColumns={@JoinColumn(name=”course_id”)},inverseJoinColumns={@JoinColumn(name=”student_id”)})publicSet<Student>getStudents(){returnstudents;}publicvoidsetStudents(Set<Student>students){this.students=students;}@Id@GeneratedValuepublicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}@Column(name=”c_coursename”)publicStringgetCoursename(){returncoursename;}publicvoidsetCoursename(Stringcoursename){this.coursename=coursename;}}

(课程表Course)

@Entity@Table(name=”t_student”)publicclassStudent{privateIntegerid;privateStringname;privateSet<Course>courses=newHashSet<Course>();privateSet<Score>scores=newHashSet<Score>();@OneToMany(mappedBy=”student”)publicSet<Score>getScores(){returnscores;}publicvoidsetScores(Set<Score>scores){this.scores=scores;}@ManyToMany@JoinTable(name=”s_score”,joinColumns={@JoinColumn(name=”student_id”)},inverseJoinColumns={@JoinColumn(name=”course_id”)})publicSet<Course>getCourses(){returncourses;}publicvoidsetCourses(Set<Course>courses){this.courses=courses;}@Id@GeneratedValuepublicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}@Column(name=”s_name”)publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}

(Student学生表)

@Entity@Table(name=”s_score”)publicclassScore{privateIntegerid;privateStringscore;privateStudentstudent;privateCoursecourse;@ManyToOne(cascade={CascadeType.ALL})//配置级联操作@JoinColumn(name=”student_id”)publicStudentgetStudent(){returnstudent;}publicvoidsetStudent(Studentstudent){this.student=student;}@ManyToOne(cascade={CascadeType.ALL})@JoinColumn(name=”course_id”)publicCoursegetCourse(){returncourse;}publicvoidsetCourse(Coursecourse){this.course=course;}@Id@GeneratedValuepublicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}@Column(name=”s_score”)publicStringgetScore(){returnscore;}publicvoidsetScore(Stringscore){this.score=score;}}

(分数表,也是中间关联表,Score)

那么问题来了,采用Hibernate自动建表,我们看一下建表语句

12:11:08,169DEBUGSchemaExport:415-createtablec_course(idintegernotnullauto_increment,c_coursenamevarchar(255),primarykey(id))12:11:08,333DEBUGSchemaExport:415-createtables_score(idintegernotnull,s_scorevarchar(255),course_idinteger,student_idintegernotnullauto_increment,primarykey(student_id,course_id))12:11:08,455DEBUGSchemaExport:415-createtablet_student(idintegernotnullauto_increment,s_namevarchar(255),primarykey(id))

我们发现在建表是Hibernate默认将student_id和course_id联合作为主键使用,且student_id还是自增

这样显然是不对的,在这里我也实在想不到,好的办法,智能采用一个笨的办法,手动改回来!

大家最好是采用工具操作,因为,你直接create的话,student_id和course_id关联不上student,course的主键ID

不是每个人都一定快乐,不是每种痛都一定要述说。

hibernate之关于关联映射的综合应用

相关文章:

你感兴趣的文章:

标签云: