1. 问题背景与现象分析
最近在使用JeecgBoot框架开发项目时,遇到了一个关于数据库默认值的同步问题。具体表现为:通过Online表单设计器生成的代码,在表单配置界面可以正常设置字段默认值,但当我们将代码导入本地开发环境运行时,这些预设的默认值却无法正确同步到数据库中。
这个问题看似简单,实则涉及到JeecgBoot框架的多个工作机制。首先,我们需要理解JeecgBoot的Online开发模式。Online开发是JeecgBoot提供的一种快速开发方式,开发者可以通过可视化界面设计表单、配置字段属性(包括默认值),然后自动生成前后端代码。
在Online表单设计器中,我们可以很方便地为字段设置默认值。例如,对于一个"删除标志"字段(delFlag),通常会设置默认值为"0"(表示未删除)。设计器生成的代码在Online环境中运行时,这些默认值能够正常工作。然而,当我们将生成的代码导出到本地环境后,发现新增数据时这些默认值并没有被自动应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题根源探究
经过深入分析,我发现这个问题主要由以下几个因素导致:
2.1 Online代码生成与本地运行的差异
Online环境下的表单提交处理逻辑与本地生成的代码存在差异。在Online环境中,框架会在后台自动处理默认值的填充,而本地生成的代码可能缺少这部分逻辑。
2.2 实体类与数据库的默认值设置不一致
虽然我们可以在数据库表定义中设置字段的DEFAULT值,但Hibernate/JPA等ORM框架在插入新记录时,如果实体类属性为null,不一定会使用数据库定义的默认值。这取决于具体的ORM配置和实现。
2.3 代码生成模板的局限性
JeecgBoot的代码生成器可能没有充分考虑默认值在各种运行环境下的同步问题,生成的Controller代码中缺少对默认值的显式处理逻辑。
3. 解决方案实现
针对上述问题,我找到了一个可靠且易于实现的解决方案:在Controller的添加方法中显式设置默认值。以下是具体实现方式:
3.1 修改Controller代码
在对应的Controller类中,找到处理新增数据的方法(通常是带有@PostMapping注解的add方法),在保存实体之前手动设置默认值:
java复制@AutoLog(value = "basic_info-添加")
@Operation(summary="basic_info-添加")
@RequiresPermissions("baseinfo:basic_info:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody BasicInfo basicInfo) {
// 设置逻辑删除标志默认值
if(basicInfo.getDelFlag() == null) {
basicInfo.setDelFlag("0");
}
// 设置整体可用状态默认值
if(basicInfo.getOverallAvailabilityStatus() == null) {
basicInfo.setOverallAvailabilityStatus("0");
}
/
