Я уже посмотрел - Автоматически сохранять дочерние объекты с помощью JPA Hibernate
Hibernate: OneToMany сохраняет детей по каскаду
У меня естьследующие таблицы -
- Instructor_Detail (id, youtubechannel, hobby) - PRIMARY_KEY (id)
- Инструктор (id, first_name, last_name, электронная почта, instructor_detail_id) - PRIMARY_KEY (id), FOREIGN_KEY(instructor_detail_id)
- курс (id, title, instructor_id) - PRIMARY_KEY (id), FOREIGN_KEY (instructor_id)
Я пытаюсь сделать - сохранить (instructorDetail) в моем MainAppи ожидая, что соответствующие преподаватели и курсы будут сохранены автоматически
Вот мои уроки -
</p>
@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();
}
}
Я ожидаю, что когда в MainClass вызывается save (instructorDetail), инструктор иКурсы также должны быть сохранены автоматически.Однако выполнение текущего сохраняет только детали инструктора, а не инструктора и курсы.В журнале запускается только одна вставка, и не генерируются исключения.Я новичок в Hibernate, так что мои ожидания или понимание могут быть сбиты.Это возможно, хотя?