Почему Spring-data-jdbc не сохраняет мой объект Car? - PullRequest
0 голосов
/ 16 мая 2018

Я играю с spring-data-jdbc и обнаружил проблему, с которой не могу решить с помощью Google.

Независимо от того, что я пытаюсь сделать, я простоне может вставить тривиальный объект в базу данных (Bean1.java:25): carRepository.save(new Car(2L, "BMW", "5"));

Оба, без одного и с TransactionManager + @Transactional база данных (по-видимому) не фиксирует запись.

Код основан на базе данных Postgres, но вы также можете просто использовать ниже H2 и получить тот же результат.

Вот (минималистичный) исходный код: https://github.com/bitmagier/spring-data-jdbc-sandbox/tree/stackoverflow-question

Может кто-нибудь подсказать, почему автомобиль не занесен в базу данных?

1 Ответ

0 голосов
/ 17 мая 2018

Это не относится к неработающим транзакциям.Вместо этого речь идет о JDBC Spring Data, который рассматривает ваш экземпляр как существующий экземпляр, который необходимо обновить (вместо вставки).

Чтобы убедиться, что это проблема, активировав запись для org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.Вы должны увидеть update, но не insert.

. По умолчанию Spring Data JDBC рассматривает объект как новый, когда он имеет идентификатор типа объекта и значение null или примитива.тип (например, int или long) и значение 0.

У вас есть следующие опции, чтобы заставить его работать:

  1. Установитьидентификатор null и настройте схему базы данных так, чтобы она автоматически создавала новое значение при вставке.После сохранения экземпляр вашей сущности будет содержать сгенерированное значение из базы данных.

    Примечание: Spring Data JDBC установит идентификатор, даже если он является окончательным в вашей сущности.

  2. Оставьте идентификатор null и установитеэто в слушателе Before-Save к желаемому значению.

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

  4. Начиная с версии 1.1 Spring Data JDBC, вы также сможетеиспользуйте JdbcAggregateTemplate для прямой вставки без проверки идентификатора, см. https://jira.spring.io/browse/DATAJDBC-282.Конечно, вы можете сделать это в пользовательском методе вашего репозитория, как это сделано в этом примере: https://github.com/spring-projects/spring-data-examples/pull/441

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