En essayant de mettre à jour spring-boot de la version 2.1.12 à la version 2.2.4, je me suis retrouvé bloqué avec une DataIntegrityViolationException lors de l'insertion de plusieurs objets dans MySQL en utilisant JPA.
Exemple d'objet :
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@Table(name = "user")
public class User {
@Id
@Column(name = "id")
@JsonProperty("id")
private String id;
@PrimaryKeyJoinColumn
@OneToOne(cascade = CascadeType.ALL)
@JsonProperty("status")
private UserStatus status;
}
Et le statut de l'utilisateur :
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "user_status")
public class UserStatus {
@Id
@Column(name = "id")
@JsonProperty("id")
private String id;
public UserStatus(String userId) {
this.id = userId;
}
}
Pour insérer un objet dans MySQL, j'utilise le repository JPA par défaut :
@Repository
public interface UserRepository extends JpaRepository {
}
Avec spring-boot-2.1.x, userRepository.save(user)
fonctionne bien mais avec la version 2.2.x, cela provoque cette exception :
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Avec ces détails dans le journal :
Cannot add or update a child row: a foreign key constraint fails (`test`.`user_status`, CONSTRAINT `user_status_ibfk_1` FOREIGN KEY (`id`) REFERENCES `user` (`id`) ON DELETE CASCADE)
Si on active spring.jpa.show-SQL: true
, je me suis rendu compte qu'avec spring-boot-2.2.x, aucune insertion dans l'entité User
ne se fait tandis qu'avec l'ancienne version de spring, ça fonctionne.
Je n'ai trouvé aucun changement majeur dans la connexion entre spring-boot et hibernate, ni aucun changement majeur dans hibernate lui-même après la mise à jour correspondante. Y a-t-il eu des mises à jour non décrites dans les notes de version ?