Maison > Questions et réponses > le corps du texte
Je souhaite donc conserver certains objets dans SQL. Voici ma table :
CREATE TABLE `user_segment` ( `id` INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL , `name` VARCHAR(50) NOT NULL, `active` BOOLEAN NOT NULL DEFAULT true, `count` INT(11) NOT NULL, `s3_link` VARCHAR(255) NOT NULL, `created_date` datetime NOT NULL DEFAULT current_timestamp(), `modified_date` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() );
En ce moment, je travaille sur une application Spring Boot qui utilise JpaRepository. C'est ma classe.
@Data @Entity @Table(name = "user_segment") public class UserSegment { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "active") private Boolean active = true; @Column(name = "count") private Integer count; @Column(name = "s3_link") private String s3Link; @CreatedDate @Column(name = "created_date") private Date createdDate = new Date(); public UserSegment(String name, String s3Link,int count) { this.name = name; this.s3Link = s3Link; this.count = count; } }
Ma classe de référentiel ressemble à ceci :
public interface UserSegmentRepository extends JpaRepository<UserSegment, Integer> { }
Maintenant, le code auquel je m'en tiens réellement.
J'appelle d'abord le constructeur, puis la méthode standard .save().
UserSegment userSegment = new UserSegment(name, fileUrl, count); userSegmentRepository.save(userSegment);
Le nom, le nombre et l'URL du fichier sont générés correctement. Je le sais parce que je l'ai débogué et évalué avant l'instruction .save(). J'ai joint la capture d'écran de la même chose.
Cependant, lors de l'exécution de la sauvegarde, j'obtiens cette erreur SQL. J'ai même imprimé des journaux. Il semble que toutes les valeurs soient définies sur null :
org.hibernate.SQL : insert into user_segment (`active`, `count`, created_date, `name`, s3_link) values (?, ?, ?, ?, ?) 2022-02-22 20:38:06.061 DEBUG 28799 --- [nio-8080-exec-2] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : null -> null 2022-02-22 20:38:06.063 TRACE 28799 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [null] 2022-02-22 20:38:06.063 DEBUG 28799 --- [nio-8080-exec-2] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : null -> null 2022-02-22 20:38:06.063 TRACE 28799 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARCHAR] - [null] 2022-02-22 20:38:06.063 DEBUG 28799 --- [nio-8080-exec-2] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : null -> null 2022-02-22 20:38:06.063 TRACE 28799 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [null] 2022-02-22 20:38:06.063 DEBUG 28799 --- [nio-8080-exec-2] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : null -> null 2022-02-22 20:38:06.063 TRACE 28799 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [null] 2022-02-22 20:38:06.064 DEBUG 28799 --- [nio-8080-exec-2] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : null -> null 2022-02-22 20:38:06.064 TRACE 28799 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [VARCHAR] - [null] 2022-02-22 20:38:06.106 WARN 28799 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1366, SQLState: 22001 2022-02-22 20:38:06.107 ERROR 28799 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : Data truncation: Incorrect integer value: 'null' for column 'active' at row 1 2022-02-22 20:38:06.216 ERROR 28799 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/notificationservice/api/v1] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement] with root cause com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect integer value: 'null' for column 'active' at row 1 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1094) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1042) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1345) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1027) ~[mysql-connector-java-8.0.16.jar:8.0.16]
P粉6383439952023-12-06 12:51:41
J'ai résolu mon problème. Je vois que tous les paramètres sont traités comme VARCHAR lors de la liaison, bien que ce ne soit pas le cas.
Ailleurs dans mon code, j'ai un convertisseur étiqueté
@Converter(autoApply= true)
.Ce convertisseur fonctionne pour les champs VARCHAR et est automatiquement appliqué à tous les champs de toutes mes entités. Ce n’était pas intentionnel de ma part.
Si vous souhaitez un convertisseur appliqué automatiquement, certains champs peuvent remplacer ce convertisseur en spécifiant en plus plus de propriétés dans l'annotation @Column
. Voici les modifications qui ont fonctionné pour moi.
@Data @Entity @Table(name = "user_segment") @NoArgsConstructor public class UserSegment { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "`name`", nullable = false, length = 50) private String name; @Column(name = "`active`", nullable = false, columnDefinition = "default bit 1") private boolean active = true; @Column(name = "`count`", nullable = false, columnDefinition = "default integer 0") private int count; @Column(name = "s3_link", nullable = false, length = 255) private String s3Link; @CreatedDate @Temporal(value = TemporalType.TIMESTAMP) @Column(name = "created_date", nullable = false, columnDefinition = "default datetime current_timestamp()") private Date createdDate; public UserSegment(String name, String s3Link,int count) { this.name = name; this.s3Link = s3Link; this.count = count; } }