Отдельная сущность передана для сохранения при сохранении - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть несколько кодов, но он получает ошибку на personRepository.save (person2), нет необходимости исправлять это, я просто объясняю, почему это вызывает: отсоединенная сущность передана в постоянное состояние.

  @Entity
    public class Person {

        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long id;

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

        @Column(name = "wallet_id", insertable = false, updatable = false)
        private Long wallet_id;

        @ManyToOne  (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinColumn(name = "wallet_id",referencedColumnName = "id", insertable = true, updatable = true )
        private Wallet wallet;
    }




    public void testSave(String name) {
            Wallet walletNewNoHaveInDB = new Wallet(); // Generated id.

            Person person = new Person(); // Generated id.
            person.setName(name);
            person.setWallet(walletNewNoHaveInDB);
            personRepository.save(person); // This is OK and inserted into DB both(wallet , person).

            Person person2 = new Person(); // Generated id.
            person2.setName(name);
            person2.setWallet(walletNewNoHaveInDB);
            personRepository.save(person2); /// detached entity passed to persist
      }

1 Ответ

0 голосов
/ 14 апреля 2020

Я понимаю, что вы не аннотировали свой тест с помощью @Transactional - в этом случае Spring сценария создает транзакцию для вас, чтобы выполнить "сохранить", как вы ее называете. Подробнее об этом здесь: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

В 1-м случае у вас есть «новые» объекты (без ID и не управляемые провайдером JPA), и вы указали каскадирование, чтобы провайдер JPA знал как сохранить это в 1 транзакции.

Во втором случае вы добавляете кошелек, который уже является управляемым объектом, но без транзакции.

Вам нужно сделать все это в области действия @Transactional (аннотировать свой тест), или если вы передайте объект "извне" транзакции (это ваш сценарий), опять же ... вам нужна транзакция - поэтому вам нужно запустить ее и вызвать merge () для объекта, который приходит извне.

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