jfinal 映射表无主键问题

我们现在有一个项目 很多表都是没有设置主键的,不改变表结构的基础上现在我们想重构(使用Jfinal),有一个问题,使用自动生成model方法不行,因为没有主键id,这种情况需要怎么搞?

感激!

评论区

JFinal

2017-12-13 10:31

jfinal 的 Model 使用的是 Active Record 模式,该模式的一个基本要求是,一个 model 对象唯一对应一条数据表中的记录,而对应的机制就是使用主键

如果没有主键的话,Active Record 模式就无从谈起。建议每个表都要有主键,看一下《阿里巴巴Java开发手册(终极版)》里头的第五章建表规约中第 9 条,表必须要主键,阿里比较狠强制要求主键名为 "id"

如果没有主键,但希望使用 jfinal 的 ActiveRecordPlugin,可以用一下 Db + Record 模式,这里头的大部分 API 是不需要主键的

还有一个可行的办法是为原先没有主键的表创建一个名为 "id" 的主键,让其为自增,而在 java 代码中不去用这引主键就可以了,当主键不存在

leomj

2017-12-13 15:53

非常感谢!

JFinal

2017-12-13 16:27

@leomj 没有主键的话, model.save()、model.update()、model.delete() 这些方法就不可能实现,前面这三个方法生成 sql 时,都是要依赖 id 生成 where 部分的,例如:
...... where id = ?

天气晴

2018-06-06 17:50

一个表中有多个主键,那应该怎么映射啊?@JFinal

JFinal

2018-06-06 17:53

@天气晴 使用 jfinal 的生成器是自动化搞定的,如果手动映射是这样:
arp.addMapping(tableName, "主键1, 主键2, 主键n", modelClass);

相当于是指定第二个参数,多主键用逗号分隔

天气晴

2018-06-09 11:08

@JFinal 好的,非常感谢

Code_Cat

2019-07-25 13:02

@JFinal 我想请问一下,假如我使用addMapping时没有指定主键,然后使用model中的删除方法时会不会报错呢,我看了一下源代码,发现primaryKey的初始值为null,而addMapping不指定主键的时候又没有默认值,在生成sql语句的时候又需要getPrimaryKey(),应该会报错吧,那如果报错的话,还要addMapping(String tableName, Class> modelClass)这个方法干嘛呢,求回答

JFinal

2019-07-25 13:26

@Code_Cat 会出错误,试一试便知

Code_Cat

2019-07-25 13:36

@JFinal 假如不指定主键,会有默认主键吗

Code_Cat

2019-07-25 13:39

@JFinal 我可以这样理解吗?就是在addMapping时如果不指定主键,就不能使用deleteById类似的方法是吗,使用的话就会报错。这个方法是提供给那些没有主键的表使用的是吗

JFinal

2019-07-25 14:17

@Code_Cat 会有默认主键,注意看 Dialect. 中的 getDefaultPrimaryKey()

Code_Cat

2019-07-25 15:31

@JFinal 这个方法我看到了,可是我在model和DB+record实现方法并不一样,在model中String[] pKeys = table.getPrimaryKey();然后返回sql,再利用DbPro执行;Db+record是利用getDefaultPrimaryKey()获得默认主键。求解答

JFinal

2019-07-25 15:56

@Code_Cat 单步调试看代码的动态执行流程,远比这里一个一个问题要高效得多