jfinal调用save方法主键冲突的问题,是我使用方法不对?

发布于 2021-11-29 11:05:43 字数 2326 浏览 692 评论 6

@JFinal 你好,想跟你请教个问题:

直接看代码吧,为了方便我将业务方法『根据手机号注册』放在Customer类中

public class Customer extends Model<Customer> {
    public static final Customer dao = new Customer();

    public static final String ID = "id";
    public static final String USERNAME = "username";
    public static final String FULLNAME = "fullname";
    public static final String PASSWORD = "password";
    public static final String SALT = "salt";
    public static final String MOBILE = "mobile";
    public static final String EMAIL = "email";
    public static final String IS_ACTIVE = "is_active";
    public static final String CREATE_BY = "create_by";
    public static final String CREATE_DATE = "create_date";
    public static final String LAST_UPDATE_BY = "last_update_by";
    public static final String LAST_UPDATE_DATE = "last_update_date";
    public static final String IS_DELETE = "is_delete";

    //根据手机号注册
    public void registByMobile(String mobile, String password) {

        //。。。无关代码。。。

        new Customer().dao.
                set(Customer.USERNAME, username).
                set(Customer.MOBILE, mobile).
                set(Customer.PASSWORD, encodPwd).
                set(Customer.SALT, fakeSalt).
                set(Customer.IS_ACTIVE, "Y").
                set(Customer.CREATE_BY, 0).
                set(Customer.CREATE_DATE, DateUtil.getNow()).
                set(Customer.LAST_UPDATE_BY, 0).
                set(Customer.LAST_UPDATE_DATE, DateUtil.getNow()).
                set(Customer.IS_DELETE, "N").
                save();
    }
}



然后在controller的action中调用,如下:

//进行注册
        Customer.dao.registByMobile(mobile, password);



当我在系统中注册成功一个用户后,然后继续注册,则报主键冲突错误,请问是不能这样用嘛,报错如下:

com.jfinal.plugin.activerecord.ActiveRecordException: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '11' for key 'PRIMARY'




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

眼眸里的那抹悲凉 2021-11-30 19:57:54

哈哈,不错不错! 其实我去年也试过用反射来实现,但感觉不爽。

本宫微胖 2021-11-30 19:48:25

回复
啥时候上线啊?

初见你 2021-11-30 19:40:40

不错 不错 谢啦

温柔少女心 2021-11-30 19:00:56

model 这个写法真不好。

先说写起来的工作量,model.set(XModel.FieldName, value);

谁知道会重复多少遍呢,如果换成model.setFieldName这样子,至少IDE会为你省事。

谁知道这个字段的具体数据类型呢?Model.set(String key, Object value),你又说要去看数据库文档或者model里面的注释?系统稍微复杂的时候,也不方便。

我总结model get/set写法有两种:

一个是在model中声明属性,比如:

public class User extends Model<User> {

    public static final User dao = new User();

    //////////////////////////
    //      attributes      //
    //////////////////////////
    private int id;             // primary key
    private String name;        // 用户名
    private String telphone;    // 手机

// 如下代码使用IDE快速产生,如果表字段不一致,仅仅修改get或set的key名称!
    ///////////////////////
    // getter and setter //
    ///////////////////////

    public int getId() {
       return get("Id");
    }

    public User setId(int id) {
       set("Id", id);
    }
// .... 还有更多
}

然而在IDEA中,还有个Live Template技术,自己配置一个专门写model get/set的模板,基本上可以做到秒杀的速度完成get/set 的编写,有兴趣的同学自己去研究(相比上面的所有做法都要快上好几倍
)。

把回忆走一遍 2021-11-30 16:18:14

谢谢啊 大大你又快又棒 拿到首期款就给你赞助

好听的两个字的网名 2021-11-29 18:19:08

     dao 对象是全局共享的,只能用于查询,不能承载数据,所以将以上有 dao 的代码删掉 dao 即可:new Customer().dao. set(...) 改成: new Customer(). set(...)。Customer.dao.registByMobile(mobile, password); 改成 new Customer().registByMobile(mobile, password); 

   jfinal 手册上有红色字体明确说明过这个问题,在此下载手册:http://www.jfinal.com

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文