记一次MyBatis报错 org.apache.ibatis.session.defaults.DefaultSqlSession

在使用MyBatis向数据库插入记录时遇到错误,原因是某字段为null,而该字段在数据库中被设置为不允许为null。通过确保传入字段不为null解决了问题。

今天使用MyBatis向数据库中插入一跳记录,报错如下:

 SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74794994] was not registered for synchronization because synchronization is not active

找了半天,发现报错就是因为我的某个字段是null,而数据库设计的时候,这个字段不能为null,所以报错,修改传入的字段不为null错误得到解决。

欢迎关注本人公众号,一起学习,交流。

 

### org.apache.ibatis.session.defaults.DefaultSqlSession 使用说明 `DefaultSqlSession` 是 MyBatis 中用于执行 SQL 命令的主要接口实现类。通过 `SqlSessionFactory.openSession()` 方法创建会话实例,该实例提供了操作数据库所需的方法。 #### 创建 SqlSession 实例 ```java // 获取 SqlSessionFactory 对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 打开一个新的 SqlSession 实例,默认情况下是非自动提交模式 try (SqlSession session = sqlSessionFactory.openSession()) { // 可以在此处调用查询、更新等方法 } ``` 当遇到类似于 “SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@ec18b38] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.jdbc.JDBC4Connection@749d2bf5] will not be managed by Spring”的错误提示时[^1],通常意味着当前事务管理器未能接管此连接,从而无法保证事务一致性。 ### 解决方案 为了使 `SqlSession` 能够参与 Spring 的声明式事务管理,需确保: - **配置文件设置正确**:确认 spring-mybatis.xml 或其他形式的配置文件中已定义 `<tx:annotation-driven />` 和相应的事务管理器 bean 定义。 - **开启 @Transactional 注解支持**:如果采用基于注解的方式,则应在服务层类上加上 `@Service` 并启用 `@EnableTransactionManagement` 来激活事务拦截机制。 - **检查数据源配置**:验证 DataSource Bean 是否已被正确注入到 SqlSessionFactoryBean 中,并且其属性如 maxActive, initialSize 等参数合理配置。 另外,在某些场景下,可能是因为开启了多个线程并发访问同一个 Session 导致的问题。对于这种情况,建议每次请求都获取新的 Session 进行操作而不是共享单个实例。 关于插入失败的情况,可能是由于表结构约束引起的异常。例如,存在 NOT NULL 列却尝试插入 null 值就会引发此类问题[^4]。因此,在设计阶段应充分考虑业务逻辑需求并适当调整列属性;或者在程序层面预先填充必要的默认值再执行 insert 操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值