gpt4 book ai didi

java - 保存父对象后自动保存子对象

转载 作者:行者123 更新时间:2023-11-30 05:37:27 25 4
gpt4 key购买 nike

我已经看过了 - Save child objects automatically using JPA Hibernate

Hibernate: OneToMany save children by cascade

我有以下表格 -

  • Instructor_Detail(id、youtubechannel、爱好)- PRIMARY_KEY (id)
  • 讲师(id、名字、姓氏、电子邮件、讲师详细信息 ID)-PRIMARY_KEY (id)、FOREIGN_KEY (instructor_detail_id)
  • 类(class)(id、标题、instructor_id)- PRIMARY_KEY (id)、FOREIGN_KEY(instructor_id)

我正在尝试在我的 MainApp 中保存(instructorDetail),并期望自动保存关联的讲师和类(class)

这是我的类(class) -

<p></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) 时,讲师和类(class)也应该自动保存。但是,执行当前仅保存讲师详细信息,而不保存讲师和类(class)。日志中仅触发一次插入,并且不会生成异常。我是 Hibernate 的新手,所以我的期望或理解可能会有所偏差。但这可能吗?

最佳答案

JPA CascadeType您配置的( DETACHMERGEPERSISTREFRESH )仅在与 Session 一起使用时具有级联效果的evict() , merge() , persist() , refresh() 。 (参见this)

但是您正在使用 session.save()用于保存对象。这就是为什么它没有任何级联效果。更改为以下任一内容应该可以解决问题:

(1) 全部更改 CascadeTypeALL .

(2) 使用session.persist()插入记录:

  session.persist(insDet1);

关于java - 保存父对象后自动保存子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com