Это не относится к неработающим транзакциям.Вместо этого речь идет о JDBC Spring Data, который рассматривает ваш экземпляр как существующий экземпляр, который необходимо обновить (вместо вставки).
Чтобы убедиться, что это проблема, активировав запись для org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
.Вы должны увидеть update
, но не insert
.
. По умолчанию Spring Data JDBC рассматривает объект как новый, когда он имеет идентификатор типа объекта и значение null
или примитива.тип (например, int
или long
) и значение 0
.
У вас есть следующие опции, чтобы заставить его работать:
Установитьидентификатор null
и настройте схему базы данных так, чтобы она автоматически создавала новое значение при вставке.После сохранения экземпляр вашей сущности будет содержать сгенерированное значение из базы данных.
Примечание: Spring Data JDBC установит идентификатор, даже если он является окончательным в вашей сущности.
Оставьте идентификатор null
и установитеэто в слушателе Before-Save к желаемому значению.
Позвольте вашей организации реализовать Persistable
.Это позволяет вам контролировать, когда объект считается новым .Возможно, вам также понадобится слушатель, чтобы вы могли сообщить, что объект больше не является новым.
Начиная с версии 1.1 Spring Data JDBC, вы также сможетеиспользуйте JdbcAggregateTemplate
для прямой вставки без проверки идентификатора, см. https://jira.spring.io/browse/DATAJDBC-282
.Конечно, вы можете сделать это в пользовательском методе вашего репозитория, как это сделано в этом примере: https://github.com/spring-projects/spring-data-examples/pull/441