1.創建序列并綁定id
CREATE SEQUENCE biz_factory_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
"id" int4 NOT NULL DEFAULT nextval('sys_user_seq'::regclass),
2.實體設置KeySequence和TableId注解
注意IdType.INPUT 和 @KeySequence(value = "biz_factory_seq", dbType = DbType.POSTGRE_SQL)
3.GlobalConfig 配置 PostgreKeyGenerator
@EnableTransactionManagement
public class DataSourceConfig {...@Bean(name = "pgKeyGenerator")public PostgreKeyGenerator postgreKeyGenerator() {return new PostgreKeyGenerator();}@Bean(name = "dbConfig")public GlobalConfig.DbConfig dbConfig() {GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();dbConfig.setKeyGenerator(postgreKeyGenerator());return dbConfig;}@Bean(name = "globalConfig")public GlobalConfig globalConfig() {GlobalConfig globalConfig = new GlobalConfig();globalConfig.setDbConfig(dbConfig());return globalConfig;}}
4. 到這里應該就配置完成,可以正常新增并且使用序列自增id,但我的項目還是在報錯:
### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: null value in column \"id\" of relation \"biz_factory\" violates not-null
- 一直報錯id為空,沒有去獲取序列的值,未配置成功
- 然后就一直找問題,試了很多辦法,依然沒有解決
- 后來我全局查看,我的項目用的多數據源,數據源單獨配置了SqlSessionFactory,考慮是不是postgreKeyGenerator沒有配置進去
5.解決
//添加mybatis-plus 對pg自用序列的主鍵自增配置
GlobalConfig conf = new GlobalConfig();
conf.setDbConfig(new GlobalConfig.DbConfig().setKeyGenerators(Arrays.asList(new PostgreKeyGenerator())));
factoryBean.setGlobalConfig(conf);
- 將配置添加進SqlSessionFactory,然后就成功了
- 先去查序列的值,再執行插入
6.總結
- 這個問題,耗了一下午,一定要堅持不放棄
- 全局審視非常重要