Estoy usando CrudRepository.save(Entity) para insertar una Entidad con @ID ya poblada.
Recibo la siguiente excepción.
Caused by: org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity [com.comanyname.repository.Entiy.class]. Id [ed384316-9c22-4b63-90fd-ec02fdac2b86] not found in database. Puedo entender el problema ya que el campo @ID ya está lleno, AggregateChangeExecutor aquí está tratando esta acción como DbAction.Update.
Entonces, quería saber si hay alguna forma en que pueda usar CrudRepository.save(Entity) para insertar una nueva entidad con un campo @ID predefinido, ya que quería usar el gancho @DomainEvent en CrudRepository.save (Entidad).
Siento que esto es un error en spring-data-jdbc . Solo quería una opinión/solución aquí.
De acuerdo con Spring Data Refrence Documentation , el JPA EntiyManager subyacente utiliza tres estrategias para determinar si una entidad es nueva:
Inspección de propiedad de versión e Id-propiedad (predeterminada): por defecto, Spring Data JPA inspecciona primero si hay una propiedad de versión de tipo no primitivo. Si existe la entidad se considera nueva si el valor es
null. Sin tal propiedad de versión, Spring Data JPA inspecciona la propiedad del identificador de la entidad dada. Si la propiedad del identificador esnull, se supone que la entidad es nueva. De lo contrario, se supone que no es nuevo.Implementación de
Persistable: si una entidad implementaPersistable, Spring Data JPA delega la nueva detección al métodoisNew(…)de la entidad. Vea el JavaDoc para más detalles.Implementación
EntityInformation: puede personalizar la abstracción deEntityInformationutilizada en la implementación deSimpleJpaRepositorycreando una subclase deJpaRepositoryFactoryy anulando elgetEntityInformation(…)consecuencia. Luego debe registrar la implementación personalizada deJpaRepositoryFactorycomo un bean Spring. Tenga en cuenta que esto rara vez debería ser necesario. Vea el JavaDoc para más detalles.
En tu caso, usar la segunda estrategia podría ser la más útil. Espero eso ayude.
Se me señaló que la pregunta no era sobre JPA, sino sobre spring-data-jdbc. Esto es correcto pero no cambia la respuesta ya que el mismo comportamiento está documentado en Spring Data JDBC-Reference Documentation .