Spring, Hibernate, JPA - Почему я не использую менеджер сущностей, почему casacdeType.Persist работает только с менеджером сущностей - PullRequest
1 голос
/ 04 ноября 2019

Я проверял, как работает каскад, и столкнулся с некоторыми вещами, которые меня смущают. У меня есть две простые сущности:

@Entity
public class Child {

    @Id
    Long id;

    @OneToOne()
    @JoinColumn(name = "JOINCOLMN", referencedColumnName = "ID")
    Person person;
}

@Entity
public class Person {

    @Id
    Long id;

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
    Child child;

}

Я проверял каскадный тип persist. Итак, я написал этот фрагмент кода:

Person person = new Person();
        person.setId(100L);
        person.setName("SomeName");
        Child child = new Child();
        child.setId(60L);
        child.setPerson(person);
        personRepository.save(person);

Однако, хотя оба они должны были быть настойчивыми, только человек становится настойчивым. Итак, первый вопрос:

  • Почему это не работает?

Я немного обыскал и нашел людей, использующих менеджер сущностей Hibernate. Вот пример, где работает постоянный каскадный тип:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Author a = new Author();
a.setFirstName(“John”);
a.setLastName(“Doe”);

Book b1 = new Book();
b1.setTitle(“John’s first book”);
a.getBooks().add(b1);

Book b2 = new Book();
b2.setTitle(“John’s second book”);
a.getBooks().add(b2);

em.persist(a);

em.getTransaction().commit();
em.close();

Мой второй вопрос:

  • Я вижу, что менеджер сущностей используется для управления транзакцией и управленияюридические лица. Но я никогда не использую его, так что же происходит с моим фрагментом кода? Кто управляет транзакцией? Кто сохранил сущность?

1 Ответ

1 голос
/ 04 ноября 2019

Spring JPA может помочь вам управлять транзакцией с помощью репозиториев или аннотации @Transactional. Он в основном обертывает любой метод, поэтому ядро ​​метода выполняется в транзакции. В вашем случае вызов personRepository.save(person) открывает транзакцию и фиксирует изменения в базе данных.

Что касается вашего первого вопроса, проблема связана с вашими отношениями @OneToOne и реализацией их установщиков. Вызов child.setPerson(person); не устанавливает ребенка этого человека. Следовательно, при вызове personRepository.save(person), поскольку дочерний элемент этого объекта равен нулю, отсутствует дочерний объект для сохранения.

Требуется обеспечить согласованность состояния объекта:

Person person = new Person();
        person.setId(100L);
        person.setName("SomeName");
        Child child = new Child();
        child.setId(60L);
        child.setPerson(person);
        person.setChild(child);
        personRepository.save(person);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...