但需要注意的是,在官网有这么一句话
Usually you do not set ID of a model. ActiveJDBC will manage that. If you find setting ID of a model, stop and question what you are doing. If you indeed decide to do this, keep in mind that ActiveJDBC uses ID presence to determine if it needs to generate INSERT or UPDATE statements.
大致的意思是,请在插入数据的时候不要对ID设置值,如果要设置,请使用其他方法。
这个其他方法他也提供了,代码如下:
Apple apple = new Apple();
apple.set("apple_type", "sweet");
apple.setId(1);
apple.insert();
Apple apple1 = new Apple();
apple1.set("apple_type", "sour");
apple1.setId(2);
apple1.insert();
所以如果我们使用createIt(),却写了如下代码,将不会往数据库中写入数据。
Apple.createIt("id",1,"name","Apple1");
那么createIt()到底做了什么,为什么会这样,我们认为的create是创建,怎么会创建不了数据。让我们分析下他的源码。
先看看Model这个类,这个类属于org.javalite.activejdbc包
public static <T extends Model> T create(Object... namesAndValues) {
return ModelDelegate.create(modelClass(), namesAndValues);
}
public static <T extends Model> T createIt(Object... namesAndValues) {
return ModelDelegate.createIt(modelClass(), namesAndValues);
}
public boolean saveIt() {
boolean result = this.save();
......
}
public boolean save() {
......
}
然后来看看ModelDelegate这个类,这个类属于org.javalite.activejdbc包
public static <T extends Model> T create(Class<T> clazz, Object... namesAndValues) {
try {
return ((Model)clazz.newInstance()).set(namesAndValues);
} catch ......
}
public static <T extends Model> T createIt(Class<T> clazz, Object... namesAndValues) {
Model model = create(clazz, namesAndValues);
model.saveIt();
return model;
}
从上面可以看出,create()没有调用saveIt()的方法,所以在使用后需要手工调用save,而createIt()调用了saveIt()的方法,所以不需要手工调用save
而且createIt()中调用了create()方法。
createIt()中调用的是saveIt(),saveIt()调用的是save(),所以我们看一下save()的代码,在Model类中
public boolean save() {
if(this.frozen) {
throw new FrozenException(this);
} else {
this.fireBeforeSave();
this.validate();
if(this.hasErrors()) {
return false;
} else {
boolean result;
if(this.getId() == null && !this.compositeKeyPersisted) {
result = this.insert();
} else {
result = this.update();
}
this.fireAfterSave();
return result;
}
}
}
其中 if(this.getId() == null && !this.compositeKeyPersisted) 表明了只有不设置ID,且没有联合主键,才做insert操作,不然就做update操作
因此官网才会提醒不要再调用createIt()时设置ID。
最后提醒一下:
在插入数据时可以调用insert()方法,但更新数据是却不能使用update()方法,因为它是private的