我有 3 个实体:Instructor
实体、Course
实体和 InstructorDetail
实体。
3 个实体之间有两种关系:
Instructor[one] - course[many]
Instructor[one] - InstructorDetail[one]
现在,当我在会话中保存新课程时出现此错误:
Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hibernate.one_to_many_bi.entity.Instructor
在 main() 中:
Session session = sessionFactory.openSession();
try {
Instructor instructor = new Instructor("Susan", "Snow", "Susan@gmail.com");
instructor.setInstructorDetail(new InstructorDetail("youtube", "video game"));
Course course1 = new Course("Air Guitar - The Ultimate Guide");
instructor.addCourse(course1);
session.beginTransaction();
session.save(course1);
session.getTransaction().commit();
}
finally {
session.close();
sessionFactory.close();
}
为什么我的代码不起作用?我的 Course
类中已经有除 CascadeType.REMOVE
之外的所有类型的级联注释。为什么 Instructor 和 InstructorDetail 没有通过级联自动保存到数据库中?
讲师班:
@Entity
@Table(name = "instructor")
@Slf4j
@Data
public class Instructor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column()
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")
@ToString.Exclude
@Setter(AccessLevel.NONE)
private InstructorDetail instructorDetail;
@OneToMany(mappedBy = "instructor",
cascade = {
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH
})
@ToString.Exclude
@Setter(AccessLevel.NONE)
private List<Course> courses;
public Instructor() {}
public Instructor(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public void setInstructorDetail(InstructorDetail instructorDetail) {
instructorDetail.setInstructor(this);
this.instructorDetail = instructorDetail;
}
public void addCourse(Course course) {
if (courses == null) {
courses = new ArrayList<>();
}
course.setInstructor(this);
courses.add(course);
}
}
课程:
@Entity
@Table(name = "course")
@Slf4j
@Data
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "title")
private String title;
@ToString.Exclude
@ManyToOne(cascade = {
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH
})
@JoinColumn(name = "instructor_id")
private Instructor instructor;
public Course() {
}
public Course(String title) {
this.title = title;
}
}
InstructorDetail 类:
@Entity
@Table(name = "instructor_detail")
@Slf4j
@Data
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.DETACH,
CascadeType.PERSIST,
CascadeType.REFRESH})
@ToString.Exclude
Instructor instructor;
public InstructorDetail() {
}
public InstructorDetail(String youtubeChannel, String hobby) {
this.youtubeChannel = youtubeChannel;
this.hobby = hobby;
}
}
我刚接触冬眠。我在网上做了一些研究,并没有找到太多关于父对象和子对象之间的依赖关系。如果有人能告诉我为什么我的代码不起作用,我真的很感激。