Сохранить дочерние объекты автоматически после сохранения родительского - PullRequest
1 голос
/ 26 мая 2019

Я уже посмотрел - Автоматически сохранять дочерние объекты с помощью 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, так что мои ожидания или понимание могут быть сбиты.Это возможно, хотя?

1 Ответ

1 голос
/ 27 мая 2019

JPA CascadeType, который вы настроили (DETACH, MERGE, PERSIST, REFRESH), имеет только каскадный эффект при использовании с Session 's evict(), merge(), persist(), refresh().(См. this )

Но вы используете session.save() для сохранения объектов. Именно поэтому он не дает никакого каскадного эффекта.Изменение на одно из следующих должно решить проблему:

(1) Измените все CascadeType на ALL.

(2) Используйте session.persist() для вставки записи:

  session.persist(insDet1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...