Почему Spring-data-jdbc не сохраняет мой объект Car?
Я поигрался с 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/stackru-question
Может кто-нибудь сказать мне, почему автомобиль не вставлен в базу данных?
1 ответ
Это не связано с неработающими транзакциями. Вместо этого речь идет о Spring Data JDBC, рассматривающем ваш экземпляр как существующий экземпляр, который необходимо обновить (вместо вставки).
Вы можете убедиться, что это проблема, активировав org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
, Вы должны увидеть update
но нет insert
,
По умолчанию Spring Data JDBC рассматривает объект как новый, если у него есть идентификатор типа объекта и значение null
или примитивного типа (например, int
или же long
) и значение 0
,
У вас есть следующие варианты, чтобы заставить его работать:
Установите идентификатор в
null
и настройте схему базы данных так, чтобы она автоматически создавала новое значение при вставке. После сохранения экземпляр вашей сущности будет содержать сгенерированное значение из базы данных.Примечание. Spring Data JDBC установит идентификатор, даже если он является окончательным для вашей сущности.
Оставь свой идентификатор
null
и установите в прослушивателе Before-Save желаемое значение.Позвольте вашей сущности реализовать
Persistable
, Это позволяет вам контролировать, когда объект считается новым. Возможно, вам также понадобится слушатель, чтобы вы могли сообщить, что сущность больше не нова.