Skip to content

Commit d015d83

Browse files
committed
完善ManyToOne的懒加载
1 parent 05b72f3 commit d015d83

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

src/net/tsz/afinal/FinalDb.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import net.tsz.afinal.db.sqlite.CursorUtils;
2727
import net.tsz.afinal.db.sqlite.DbModel;
28+
import net.tsz.afinal.db.sqlite.ManyToOneLazyLoader;
2829
import net.tsz.afinal.db.sqlite.OneToManyLazyLoader;
2930
import net.tsz.afinal.db.sqlite.SqlBuilder;
3031
import net.tsz.afinal.db.sqlite.SqlInfo;
@@ -373,7 +374,7 @@ public <T> T findWithManyToOneById(Object id ,Class<T> clazz){
373374
DbModel dbModel = findDbModelBySQL(sql);
374375
if(dbModel!=null){
375376
T entity = CursorUtils.dbModel2Entity(dbModel, clazz);
376-
return loadManyToOne(entity,clazz);
377+
return loadManyToOne(dbModel,entity,clazz);
377378
}
378379

379380
return null;
@@ -393,24 +394,33 @@ public <T> T findWithManyToOneById(Object id ,Class<T> clazz,Class<?> ... findCl
393394
DbModel dbModel = findDbModelBySQL(sql);
394395
if(dbModel!=null){
395396
T entity = CursorUtils.dbModel2Entity(dbModel, clazz);
396-
return loadManyToOne(entity,clazz,findClass);
397+
return loadManyToOne(dbModel,entity,clazz,findClass);
397398
}
398399
return null;
399400
}
400401

401402
/**
402403
* 将entity中的“多对一”的数据填充满
404+
* 如果是懒加载填充,则dbModel参数可为null
403405
* @param clazz
404406
* @param entity
405407
* @param <T>
406408
* @return
407409
*/
408-
public <T> T loadManyToOne(T entity,Class<T> clazz,Class<?> ... findClass) {
410+
public <T> T loadManyToOne(DbModel dbModel,T entity,Class<T> clazz,Class<?> ... findClass) {
409411
if(entity!=null){
410412
try {
411413
Collection<ManyToOne> manys = TableInfo.get(clazz).manyToOneMap.values();
412414
for(ManyToOne many : manys){
413-
Object id = many.getValue(entity);
415+
416+
Object id = null;
417+
if(dbModel!=null){
418+
dbModel.get(many.getColumn());
419+
}else if(many.getValue(entity).getClass()== ManyToOneLazyLoader.class
420+
&&many.getValue(entity)!=null){
421+
id = ((ManyToOneLazyLoader)many.getValue(entity)).getFieldValue();
422+
}
423+
414424
if(id!=null){
415425
boolean isFind = false;
416426
if(findClass == null || findClass.length==0){
@@ -423,10 +433,19 @@ public <T> T loadManyToOne(T entity,Class<T> clazz,Class<?> ... findClass) {
423433
}
424434
}
425435
if(isFind){
436+
426437
@SuppressWarnings("unchecked")
427-
T manyEntity = (T) findById(Integer.valueOf(id.toString()), many.getDataType());
438+
T manyEntity = (T) findById(Integer.valueOf(id.toString()), many.getManyClass());
428439
if(manyEntity!=null){
429-
many.setValue(entity, manyEntity);
440+
if(many.getValue(entity).getClass()== ManyToOneLazyLoader.class){
441+
if(many.getValue(entity)==null){
442+
many.setValue(entity,new ManyToOneLazyLoader(entity,clazz,many.getManyClass(),this));
443+
}
444+
((ManyToOneLazyLoader)many.getValue(entity)).set(manyEntity);
445+
}else{
446+
many.setValue(entity, manyEntity);
447+
}
448+
430449
}
431450
}
432451
}

src/net/tsz/afinal/db/sqlite/CursorUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public static <T> T getEntity(Cursor cursor, Class<T> clazz,FinalDb db){
6666
for(ManyToOne manyToOneProp : table.manyToOneMap.values()){
6767
if(manyToOneProp.getDataType()==ManyToOneLazyLoader.class){
6868
ManyToOneLazyLoader manyToOneLazyLoader = new ManyToOneLazyLoader(entity,clazz,manyToOneProp.getManyClass(),db);
69+
manyToOneLazyLoader.setFieldValue(cursor.getInt(cursor.getColumnIndex(manyToOneProp.getColumn())));
6970
manyToOneProp.setValue(entity,manyToOneLazyLoader);
7071
}
7172
}

src/net/tsz/afinal/db/sqlite/ManyToOneLazyLoader.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public class ManyToOneLazyLoader<M,O> {
1717
Class<M> manyClazz;
1818
Class<O> oneClazz;
1919
FinalDb db;
20+
/**
21+
* 用于
22+
*/
23+
private Object fieldValue;
2024
public ManyToOneLazyLoader(M manyEntity, Class<M> manyClazz, Class<O> oneClazz, FinalDb db){
2125
this.manyEntity = manyEntity;
2226
this.manyClazz = manyClazz;
@@ -32,7 +36,7 @@ public ManyToOneLazyLoader(M manyEntity, Class<M> manyClazz, Class<O> oneClazz,
3236
*/
3337
public O get(){
3438
if(oneEntity==null && !hasLoaded){
35-
this.db.loadManyToOne(this.manyEntity,this.manyClazz,this.oneClazz);
39+
this.db.loadManyToOne(null,this.manyEntity,this.manyClazz,this.oneClazz);
3640
hasLoaded = true;
3741
}
3842
return oneEntity;
@@ -41,4 +45,11 @@ public void set(O value){
4145
oneEntity = value;
4246
}
4347

48+
public Object getFieldValue() {
49+
return fieldValue;
50+
}
51+
52+
public void setFieldValue(Object fieldValue) {
53+
this.fieldValue = fieldValue;
54+
}
4455
}

src/net/tsz/afinal/db/sqlite/SqlBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class SqlBuilder {
3232

3333
/**
3434
* 获取插入的sql语句
35-
* @param tableInfo
3635
* @return
3736
*/
3837
public static SqlInfo buildInsertSql(Object entity){
@@ -370,7 +369,7 @@ private static KeyValue manyToOne2KeyValue(ManyToOne many , Object entity){
370369
if(manyobject!=null){
371370
Object manyvalue;
372371
if(manyobject.getClass()==ManyToOneLazyLoader.class){
373-
manyvalue = TableInfo.get(many.getManyClass()).getId().getValue(manyobject);
372+
manyvalue = TableInfo.get(many.getManyClass()).getId().getValue(((ManyToOneLazyLoader)manyobject).get());
374373
}else{
375374
manyvalue = TableInfo.get(manyobject.getClass()).getId().getValue(manyobject);
376375
}

0 commit comments

Comments
 (0)