JPA / Hibernate - сохранение ребенка без сохранения () - PullRequest
0 голосов
/ 09 февраля 2020

Насколько я понимаю, persist (object) метод - его следует использовать всякий раз, когда мы сохраняем новый объект в базе данных (чтобы сделать его управляемым постоянным).

В моем примере у меня есть Книга класс (родительский) и Отзыв класс (дочерний) в @ OneToMany отношениях - Одна книга имеет много рецензий.

MySQL tables

Вот классы:

@Entity
@Table(name = "book")
public class Book {

    @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 = "author_id")
    private Author author;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "book_id", referencedColumnName = "id")
    private List<Review> reviews;

    //skipping setters and getters

    public void addReview(Review review) {
        if(reviews == null) {
            reviews = new ArrayList<Review>();
        }
        reviews.add(review);
    }
}




@Entity
@Table(name = "review")
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "comment")
    private String comment;

    //skipping setters and getters
}

У меня вопрос - как я могу добавить обзор в базу данных без вызова сохраняются (обзор) , но просто с использованием метода книги addReview (обзор) ?

Вот метод, который добавляет обзор в связанную книгу и в базу данных. Все операции с этим объектом работают нормально - я могу получить обзор, обновить его или удалить.

public void addReviewToBook(String bookTitle, String comment) {
        EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
        Session session = em.unwrap(Session.class);
        Criteria cr = session.createCriteria(Book.class);
        cr.add(Restrictions.ilike("title", bookTitle));
        Book book = null;
        try {
            book = (Book) cr.uniqueResult();
            em.getTransaction().begin();
            //not calling em.persist(new Review(comment)) but only using addReview method
            book.addReview(new Review((comment)));
            em.getTransaction().commit();
            System.out.println("Review added to the book");
        }
        catch (HibernateException e) {
            em.getTransaction().rollback();
            e.printStackTrace();
        }
        finally {
            em.close();
        }
    }

enter image description here

Может кто-нибудь объяснить это?

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