Так что даже когда я использовал каскадирование, я получаю исключение
java.lang.IllegalStateException: org.hibernate.TransientObjectException:
Учитывая тот факт, что я использую каскадирование различных отношений между данными сохранения таблиц, не должно было вызывать исключение. Но это так, поэтому нужна помощь
Вот мой код-
Instructor.java
@Entity
@Table(name="instructor")
public class Instructor {
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String emailID;
@OneToOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name="instructor_detail_id")
private InstructorDetail instructorDetailID;
@OneToMany(mappedBy="instructorId",cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
private List<Courses> courses;
}
InstructorDetail.java
@Entity
@Table(name="instructor_detail")
public class InstructorDetail {
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name="youtube_channel")
private String youtubeChannel;
@Column(name="hobby")
private String hobby;
@OneToOne(mappedBy="instructorDetailID", cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.PERSIST})
private Instructor instructor;
}
Courses.java
@Entity
@Table(name="course")
public class Courses {
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
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 instructorId;
}
createRecordDemo.java
public class createRecordDemo {
public static void main(String[] args) {
//Build Session Factory
SessionFactory factory=new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Instructor.class)
.addAnnotatedClass(InstructorDetail.class).addAnnotatedClass(Courses.class).buildSessionFactory();
//get current session
Session session= factory.getCurrentSession();
try {
//begin transaction
session.beginTransaction();
Instructor instructor= new Instructor("Chad","Darby","chadDarby@luv2Code.com");
Instructor instructor2= new Instructor("Bharath","Thippireddy","bharath@gmail.com");
Instructor instructor3= new Instructor("Deepali","Srivastava","deepali@gmail.com");
InstructorDetail instructorDetail= new InstructorDetail("luv2Code","Teaching");
InstructorDetail insDetail2=new InstructorDetail("DS&Algo","Problem Solving");
InstructorDetail insDetail3= new InstructorDetail("webServices","communication");
instructor.setInstructorDetailID(instructorDetail);
instructor2.setInstructorDetailID(insDetail2);
instructor3.setInstructorDetailID(insDetail3);
Courses course1= new Courses("Spring");
Courses course2= new Courses("Hibernate");
Courses course3= new Courses("DataStructures and Algorithm");
Courses course4= new Courses("Web services- SOAP & REST");
course1.setInstructorId(instructor);
course2.setInstructorId(instructor);
course3.setInstructorId(instructor2);
course4.setInstructorId(instructor3);
session.save(course1);
session.save(course2);
session.save(course3);
session.save(course4);
session.getTransaction().commit();
} catch (Exception e) {
System.out.println("Exception Occured"+e);
e.printStackTrace();
}finally {
session.close();
factory.close();
}
}
}
Я понимаю, что одним из способов преодоления данного исключения является сохранение объекта инструктора перед объектом курса. Но я хочу, чтобы Hibernate справился с этим. Я не использовал CascadeType.ALL, потому что не хочу, чтобы детали инструктора удалялись при удалении курса.
Я новичок в фреймворке, и мне нравится его изучать. Я попробовал ответы на аналогичный вопрос, но я хочу знать, где мой код не работает
error-INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Hibernate: insert into course (instructor_id, title) values (?, ?)
Hibernate: insert into course (instructor_id, title) values (?, ?)
Hibernate: insert into course (instructor_id, title) values (?, ?)
Hibernate: insert into course (instructor_id, title) values (?, ?)
Exception Occuredjava.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: entity.Instructor
java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: entity.Instructor