问题描述
在使用tk提供的InsertMapper的insert方法时,不会将自增ID回写到记录中。
问题复现
maven依赖
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version>
</dependency>
实体类
package com.imooc.commons.dao.entity;import lombok.Data;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;@Data
@Table(name = "marketing_step_context")
public class MarketingStepContext {@Id@Column(name = "id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;/*** 上下文json*/@Column(name = "context_json")private String contextJson;@Column(name = "create_date")private Date createDate;@Column(name = "update_date")private Date updateDate;
}
mapper类
import com.imooc.commons.dao.entity.MarketingStepContext;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;@Repository
public interface MarketingStepContextMapper extends Mapper<MarketingStepContext>, MySqlMapper<MarketingStepContext> {
}
使用时
stepContextMapper.insert(stepContext); //id没有自动回写到stepContext中,导致后续更新时异常
问题原因
insert方法本身就不支持回写ID,对比insertList方法,它确实也没有 @Options注解。
解决方法
- 使用KeySql注解
@Id
@Column(name = "id")
@KeySql(useGeneratedKeys = true)
private Long id;
- 手动声明id生成器
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
private Long id;
- 使用insertList方法
stepContextMapper.insertList(Collections.singletonList(stepContext));