Jadi saya mahu mengekalkan beberapa objek ke SQL. Ini meja saya:
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() );
Sekarang, saya sedang mengusahakan aplikasi Spring Boot yang menggunakan JpaRepository. Ini kelas saya.
@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; } }
Kelas repositori saya kelihatan seperti ini:
public interface UserSegmentRepository extends JpaRepository<UserSegment, Integer> { }
Sekarang, kod yang saya benar-benar berpegang pada ini.
Saya memanggil pembina dahulu dan kemudian kaedah .save() standard.
UserSegment userSegment = new UserSegment(name, fileUrl, count); userSegmentRepository.save(userSegment);
Nama, kiraan dan URL fail dijana dengan betul. Saya tahu ini kerana saya menyahpepijat dan menilainya sebelum pernyataan .save(). Saya telah melampirkan tangkapan skrin yang sama.
Namun, apabila benar-benar melaksanakan save, saya mendapat ralat SQL ini. Saya juga mencetak beberapa log. Nampaknya semua nilai sedang ditetapkan kepada 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]
Saya menyelesaikan masalah saya. Saya melihat bahawa semua parameter dianggap sebagai VARCHAR apabila mengikat, walaupun ini tidak berlaku.
Di tempat lain dalam kod saya, saya mempunyai penukar berlabel
@Converter(autoApply= true)
.Penukar ini berfungsi untuk medan VARCHAR dan digunakan secara automatik pada semua medan dalam semua entiti saya. Ini tidak disengajakan di pihak saya.Jika anda mahukan penukar yang digunakan secara automatik, sesetengah medan boleh mengatasi penukar ini dengan menambahkan lebih banyak sifat dalam anotasi
@Column
. Di bawah ialah pengubahsuaian yang berkesan untuk saya.