MODEL执行Update/Save问题请教

代码:

//更新商品
	public void updateGood(){
//		Boolean flag=new Goods().set("Name", "维C").set("Brief", "维C泡腾片").set("Id","1").update();
		Goods good=new Goods().set("Name", "维C").set("Brief", "维C泡腾片");
		good.set("Id", "1");
		Boolean flag=good.update();
		if(flag){
			renderText("Update Success:"+new Goods().findById("1").getName());
		}else{
			renderText("Update Fail!");
		}
	}

之后时报错:

You can't update model without Primary Key, id can not be null.

2.png

表是Goods表,主键为Id。

是不是一定要为 id 不能是Id ?  


另外,还想请教下,

	public void addGood() {

		Goods good = new Goods();
		// good.setName("维生素E");
		// good.setBrief("维生素E胶囊");
		// good.setSpec("瓶");

		good.set("Name", "维生素E");
		good.set("Brief", "维生素E胶囊");
		good.set("Spec", "瓶");

		boolean flag = good.save();
		if (flag) {
			renderText("Success!");
		} else {
			renderText("Fail!");
		}
	}

这两种set(一个是键值对,一个是set属性),有什么区别呢?

我执行sava的时候,使用setName这种,会操作数据库,但是数据都为空,改成键值对这种的就可以?


求指教,谢谢。

评论区

JFinal

2018-07-02 11:32

主键名默认为小写的 "id",否则需要在映射的时候手动指定一下:
activeRecordPlugin.addMapping(tableName, "ID", modelClass);

如上所示,中间的参数 "ID" 就是大写的 id,具体到你的项目,是一个大写一个小写,改成这样:
activeRecordPlugin.addMapping(tableName, "Id", modelClass);

这种事情早在两年前就不需要手动做了,jfinal 提供了生成器,映射也是自动生成的,会自动解决大小写问题,在首页下载 jfinal demo,里面有生成器的使用例子,直接拿去改下几个参数即可使用

猴子的花果山

2018-07-02 14:25

@JFinal 好的 谢谢了,另外关于两种set 有什么区别呢? 谢谢大神亲自回复

JFinal

2018-07-02 15:27

@猴子的花果山 得看你的 Model 内部是什么代码, jfinal 的 model 内部的 setter 方法本应该是转调 set(String, Object) 方法的

猴子的花果山

2018-07-02 16:32

public class Goods extends Model{


String Id; //商品Id
String Name;//商品名称
String Brief;//商品简介
String Spec; //规格

public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getBrief() {
return Brief;
}
public void setBrief(String brief) {
Brief = brief;
}
public String getSpec() {
return Spec;
}
public void setSpec(String spec) {
Spec = spec;
}
}

Model是这样的,我用setName这种的时候,Debug能看到是有值得,但是在执行时save后 数据貌似没有带到数据库里面去,但是执行了插入。

JFinal

2018-07-02 17:23

@猴子的花果山 model.save() update() 方法生成 sql 的时候是用的 Model.attrs 中的数据,而不会用到你手动创建的 String Name 这类属性的数据,所以就没效了

正确的做法是,在 setName(String name) 方法中再转一下调父类中的:
set("name", name);

当然,这些事情在 jfinal 中都是由生成器自动生成的,不用手写

猴子的花果山

2018-07-03 16:55

@JFinal 好的 谢谢,十分感谢大牛的解答,我才开始了解JFinal,我继续学习去了。

热门分享

扫码入社