JOOQ技术问题:DAO为何存储空数据集及更新无效?
JOOQ增改操作失效问题解决
核心问题:事务未提交
JOOQ默认不会自动提交事务,你写的update和insert操作只是在内存中修改了对象,没有真正同步到数据库,这是新手最常踩的坑。
解决办法:
用事务包裹你的操作,两种方式任选:
// 推荐:用事务lambda,自动处理提交/回滚 context.transaction(config -> { AddressDao dao = new AddressDao(config); // 更新现有记录 Address address = dao.findById(1); address.setName("Test"); dao.update(address); // 插入新记录 Address newAddress = new Address(); newAddress.setName("test"); dao.insert(newAddress); }); // 手动控制提交/回滚 try { AddressDao dao = new AddressDao(context.configuration()); Address address = dao.findById(1); address.setName("Test"); dao.update(address); Address newAddress = new Address(); newAddress.setName("test"); dao.insert(newAddress); context.commit(); // 必须显式提交事务 } catch (Exception e) { context.rollback(); // 出错时回滚 }
替代方案:用Record的store()方法
JOOQ生成的Address是UpdatableRecord的子类,自带store()方法,会自动判断是插入还是更新,不用手动调用DAO的insert/update:
context.transaction(config -> { // 更新操作 Address address = dao.findById(1); address.setName("Test"); address.store(); // 插入操作 Address newAddress = new Address(); newAddress.setName("test"); newAddress.store(); });
极端情况:字段变更追踪失效
如果上面的方法都没用,可能是生成的setter没标记字段为已修改(概率极低,代码生成工具一般会自动处理),可以手动标记字段变更:
address.setName("Test"); address.changed(Address.NAME, true); // 告诉JOOQ该字段已修改 dao.update(address);
内容的提问来源于stack exchange,提问作者streetmaster86
相关产品推荐
相关产品推荐

