The One side is the Teacher entity
@Entity public class Teacher { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; @Column private String name; @OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER) @JoinColumn(name="STU_ID") @IndexColumn(name="IDX") private List<Student> students = new ArrayList<Student>(); public Teacher(String name) { super(); this.name = name; } public Teacher() { super(); } public void addStudent(Student s){ students.add(s); s.setTeacher(this); } //Setters and getters }
Note the Teacher class has a List of Students, not a Set of Students. The @IndexColumn annotation is used to specify which column in Student table to store the index.
The Many side is the Student entity
@Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; @Column private String name; @ManyToOne @JoinColumn(name="STU_ID", insertable=false, updatable=false) private Teacher teacher; public Student(String name) { Super(); this.name = name; } public Student() { super(); } //Setters and getters }
The name attribute of @JoinColumn for Teacher and Student should match one another (in this case, it is "STU_ID").
Write a JUnit test case
public void testTeacherDao(){ TeacherDao dao = (TeacherDao)applicationContext.getBean("teacherDao"); Teacher teacher = new Teacher("t1"); teacher.addStudent(new Student("s1")); teacher.addStudent(new Student("s2")); dao.save(teacher); }
Output:
Teacher table
Student table
This example works in Hibernate 4.1.7.