jfinal3.1在Oracle做无主键表的数据保存的问题

 jfinal3.1在Oracle做无主键表的数据保存,直接new对象然后save会报错,如果把对象放list里面用Db.batchSave就没问题。有哪位哥们知道是咋回事吗,还是是BUG啊。 

QQ图片20170713095313.png

报错内容是:

 com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLIntegrityConstraintViolationException: Invalid argument(s) in call 


评论区

JFinal

2017-07-13 17:50

注意一下,Db.batchSave(...) 方法会生成一条 sql ,生成该 sql 会以 list 中第一条数据 model 中的属性为蓝本,所以确保一下你所有 model 中的属性都是相同的,否则生成出来的 sql 只适用于某部分 model

这个说明在 batchSave 方法的注释文档中有说明

kun

2017-07-13 19:46

@JFinal 那为什么那个单条保存的会报错呢,一直搞不懂这个问题!

kun

2017-07-13 19:50

@kun 我看了下model.save()这个方法,里面有条是getGeneratedKey(pst, table, config);是生成主键,一个Model一定需要主键吗?

JFinal

2017-07-13 22:18

@kun model 采用的是 active record 模式,该模式的核心是一个 model 对象唯一对应一条数据表记录,这个对应关系用的就是主键,所以 model 对应的表,必须有主键

如果没有主键,使用一下 Db + Record 方式操作下数据库

kun

2017-07-13 22:55

@JFinal 谢谢波总指导,建议俱乐部可以搞点源码解读或者其他的活动,同时整合下学习资源!

JFinal

2017-07-13 23:07

@kun 正是要做的,目前做得确实不好,直播逐步会做起来

sqhua

2018-02-03 12:49

我测试过,无主键的情况下,Db + Record 也无法进行save操作呢。报错信息为
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLIntegrityConstraintViolationException: 调用中的无效参数
@JFinal

sqhua

2018-02-03 13:24

@JFinal Db.batchSave才能进行无主键操作,Save方法是不行的,这个设定很奇怪

JFinal

2018-02-03 14:11

@sqhua Active Record 设计模式所决定: 一个 model 对应一条数据表记录,而对应关系统采用主键机制

如果没有主键,你的 model.save() model.update() model.delete() 等操作就根本不可能知道是针对数据表的哪条记录来操作

sqhua

2018-02-05 15:44

@JFinal 你说的这个道理我明白,但 batchSave 能执行, Save 却不能,感觉很别扭。现在我的代码都要包装到List中,变成了:
List list = new ArrayList();
list.add( AA );
Db.batchSave("AA", list, 1 );

JFinal

2018-02-05 21:33

@sqhua Db.batchSave(...) 这个并非 Active Record 模式,所以可以,但 Model.save() 是 Active Record 模式

方法名虽然都有一个 save,但实现的方式、目的不同

热门反馈

扫码入社