I've already looked at - Save child objects automatically using JPA Hibernate
Hibernate: OneToMany save children by cascade
I have following tables -
- Instructor_Detail(id, youtubechannel, hobby) - PRIMARY_KEY (id)
- Instructor(id, first_name, last_name, email, instructor_detail_id) - PRIMARY_KEY (id), FOREIGN_KEY (instructor_detail_id)
- course(id, title, instructor_id) - PRIMARY_KEY (id), FOREIGN_KEY (instructor_id)
I'm trying to do - save(instructorDetail) in my MainApp and expecting associated instructors and courses to be save automatically
Here are my classes -
@Entity
@Table(name="instructor_detail")
public class InstructorDetail {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="youtube_channel")
private String youtubeChannel;
@Column(name="hobby")
private String hobby;
@OneToOne(mappedBy = "instructorDetail", cascade= {
CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH
})
private Instructor instructor;
//getters and setters
}
@Entity
@Table(name="instructor")
public class Instructor {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String email;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="instructor_detail_id")
private InstructorDetail instructorDetail;
@OneToMany(mappedBy="instructor",
cascade =
{CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
private List<Course> courses;
//...getters and setters
//one more method to add courses
public void addCourse(Course c) {
if(courses == null) {
courses = new ArrayList<>();
}
courses.add(c);
c.setInstructor(this);
}
}
@Entity
@Table(name="course")
public class Course {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="title")
private String title;
@ManyToOne(cascade=
{CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name="instructor_id")
private Instructor instructor;
//getters and setters
}
//MainClass -
public class OneToManyBiDirectionalDemo {
public static void main(String[] args) {
Course c1 = new Course("Multithreading");
Course c2 = new Course("WebDevelopment");
Instructor ins1 = new Instructor("John","Purcell","john.purcell@email.com");
InstructorDetail insDet1 = new InstructorDetail("com.john.purcell","teaching");
insDet1.setInstructor(ins1);
ins1.setInstructorDetail(insDet1);
ins1.addCourse(c1);
ins1.addCourse(c2);
SessionFactory factory = new Configuration().
configure("hibernate.cfg.xml"). addAnnotatedClass(Course.class). addAnnotatedClass(Instructor.class). addAnnotatedClass(InstructorDetail.class). buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
session.save(insDet1);
session.getTransaction().commit();
session.close();
factory.close();
}
}
My expectation is - when save(instructorDetail) is called in MainClass, the instructor and courses should also be save automatically. However, executing the current only saves instructor detail and not instructor and courses. Only one insert is fired in log and there are not exceptions generated. I'm new to Hibernate, so my expectations or understanding may be off. Is this possible though?