我正在使用内存中的H2数据库对一个Spring应用程序进行一些测试.该数据库有一个‘Message’表,其架构如下:

CREATE TABLE `message` (
  `id` bigint(20) NOT NULL,
  `body` CLOB,
  `channels` varchar(500) NOT NULL,
  `end_date` datetime DEFAULT NULL,
  `start` datetime DEFAULT NULL,
  `status` varchar(120) DEFAULT NULL,
  `title` varchar(120) DEFAULT NULL,
  `approved` bit(1) DEFAULT NULL,
  `approver_name` varchar(150) DEFAULT NULL,
  `approver_sub` varchar(120) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `creator_name` varchar(150) DEFAULT NULL,
  `creator_sub` varchar(120) DEFAULT NULL,
  `modify_date` datetime DEFAULT NULL,
  `affiliations` varchar(500) NOT NULL,
  `html` bit(1) NOT NULL,
  `reject_reason` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

和一个实体类:

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", length = 100, nullable = false, unique = true)
    private long id;

    @Column(name = "title", length = 120, nullable = true)
    private String title;

    @Lob
    @Column(name = "body", nullable = true)
    private String body;
...
}

在我的代码中,我试图向消息表中插入一个新条目.我有一种服务方法,如:

public Message saveMessage(MessageInput messageInput, LocalDateTime start, LocalDateTime end, String status, String requestor) {
        Message message = new Message();
        message.setTitle(messageInput.getMessage_title());
        message.setBody(messageInput.getMessage_body());
        messageRepository.save(message);
} 

其中,MessageRepository是一个org.springframework.data.repository.CrudRepository

我打开了日志(log)记录,当我运行我的代码时,我得到以下日志(log)消息:

Hibernate: insert into message (id, affiliations, approved, approver_name, approver_sub, body, channels, create_date, creator_name, creator_sub, end_date, html, modify_date, reject_reason, start, status, title) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [[Employee, Staff]]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [BOOLEAN] - [false]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [3] as [VARCHAR] - [null]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [4] as [VARCHAR] - [null]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [5] as [CLOB] - [the test body]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [6] as [VARCHAR] - [[57823ff6-e262-4201-8766-84cd17dfe116]]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [7] as [TIMESTAMP] - [2023-08-31T12:30:03.304774]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [8] as [VARCHAR] - [ptb014]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [9] as [VARCHAR] - [ptb014]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [10] as [TIMESTAMP] - [2023-09-07T12:30:03.268680]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [11] as [BOOLEAN] - [false]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [12] as [TIMESTAMP] - [2023-08-31T12:30:03.304793]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [13] as [VARCHAR] - [null]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [14] as [TIMESTAMP] - [2023-08-31T12:30:03.268680]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [15] as [VARCHAR] - [MODERATOR_APPROVED]
2023-08-31 12:30:03 [main] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [16] as [VARCHAR] - [A Title]
2023-08-31 12:30:03 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "ID"; SQL statement:
insert into message (id, affiliations, approved, approver_name, approver_sub, body, channels, create_date, creator_name, creator_sub, end_date, html, modify_date, reject_reason, start, status, title) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [23502-220]

查看日志(log),似乎INSERT包含一个id参数,但由于数据库期望生成该值,因此传递给它的是NULL.我做了一些研究,我看到的大多数建议要么将GenerationType设置为Identity,要么将spring.jpa.hibernate.ddl-auto配置更改为"更新".我两个都试过了,结果还是一样.我需要做什么才能让身份生成起作用?

推荐答案

您需要将id列声明为标识列:

id BIGINT GENERATED BY DEFAULT AS IDENTITY

在H2的MySQL或MariaDB兼容模式中,您可以使用非标准

`id` BIGINT AUTO_INCREMENT

取而代之的是.

Java相关问答推荐

在AnyLogic中增加变量计数

缩小画布比例后更改滚动窗格的内部大小

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

为什么JAVA&S清洁器使用链表而不是并发HashSet?

如何创建一个2d自上而下的移动系统,其中移动,同时持有两个关键是可能的处理?

使用Spring Boot3.2和虚拟线程的并行服务调用

Kotlin内联互操作:强制装箱

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

格式中的特定回录键-值对

JNI:将代码打包成自包含的二进制文件

我可以在@Cacheable中使用枚举吗

通过Java列表中的某些字段搜索值

STREAMS减少部分结果的问题

组合连接以从两个表返回数据

如何在字节数组中反转UTF-8编码?

如何在SWT菜单项文本中保留@字符

如何使JOOQ渐变脚本不重新创建表未更改的类?

当我try 返回可选时,Mock无法正常工作