关系

在greenDAO,实体涉及使用一对一或一对多的关系。例如,如果要模拟一个1:greenDAOñ关系,你将有一个一对一和一对多的关系。但是,请注意,一对一和一对多的关系不是相互连接,所以你必须同时更新。

//学生
@Entity
public class Student { @Id
private Long id ; private String name ; private String number ; private long PE_Id ; @ToOne(joinProperty = "PE_Id")
private PEClazz peClazz;
} //体育课
@Entity
public class PEClazz { @Id
private Long id; private int credit; private String name;
}

建立一对一关系

@ToOne注释定义的关系向另一个实体(一个实体对象)

当 修改外键 时
Student student = studentDao.queryBuilder().where(StudentDao.Properties.Id.eq(1)).unique();
PEClazz peClazz = student.getPeClazz();
System.out.println("peClazz+id:"+peClazz.getId());
System.out.println("peClazz+name:"+peClazz.getName()); //修改体育课的ID
student.setPE_Id(2); peClazz = student.getPeClazz();
System.out.println("peClazz+id:"+peClazz.getId());
System.out.println("peClazz+name:"+peClazz.getName());

运行结果(修改外键,外键对象受到改变)

peClazz+id:1

peClazz+name:篮球

peClazz+id:2

peClazz+name:足球

或者里(修改外键对象)

Student student = studentDao.queryBuilder().where(StudentDao.Properties.Id.eq(1)).unique();
PEClazz peClazz = student.getPeClazz();
System.out.println("peClazz+id:"+peClazz.getId()); //设置新的体育课
PEClazz newPeClazz = new PEClazz();
newPeClazz.setId(2L);
student.setPeClazz(newPeClazz); System.out.println("student.PE_ID:"+student.getPE_Id());

运行结果 (修改外键对象,外键受到改变)

peClazz+id:1

student.PE_ID:2

注意

在一对一关系中,当要第一次加载时,使用的是懒加载

后续调用将立即返回先前解析的对象。

如果外键属性(例如:PE_Id)受到了改变(或者外键对象受到改变(setPeClazz)),那么再次获取外键对象时(获取的外键)就会发生改变。

外键和外键对象具有关联.

建立一对多关系

//父亲类
@Entity
public class Father {
@Id
private Long id; private String name; @ToMany(referencedJoinProperty = "fatherID")
List<Son> sons ;
} //儿子类
@Entity
public class Son { @Id
private Long id; private String name; private long fatherID ;
}

@ToMany限定了关系到一组其他实体的(多个实体对象)。

referencedJoinProperty参数:指定指向该实体的ID目标实体的“外键”属性的名称。

先创建几个数据:

			Son son1 = new Son();
son1.setName("儿子1");
Son son2 = new Son();
son2.setName("儿子2");
Son son3 = new Son();
son3.setName("儿子3");
Father father = new Father();
father.setName("父亲");
long fatherID = fatherDao.insertOrReplace(father); son1.setFatherID(fatherID);
son2.setFatherID(fatherID);
son3.setFatherID(fatherID);
sonDao.insertOrReplace(son1);
sonDao.insertOrReplace(son2);
sonDao.insertOrReplace(son3);

更新操作注意

			Father father = fatherDao.queryBuilder().where(FatherDao.Properties.Id.eq(1)).unique();
List<Son> sons = father.getSons(); for (Son son: sons) {
System.out.println("son:"+son.getName());
} Son son = new Son();
son.setFatherID(father.getId());
son.setName("儿子4"); //插入
daoSession.insert(son); for (Son newSon:
sons) {
System.out.println("newSon:"+newSon.getName());
} //重新获取
List<Son> sons1 = father.getSons(); for (Son newSon1:
sons1) {
System.out.println("newSon1:"+newSon1.getName());
}

运行结果

son:儿子1

son:儿子2

son:儿子3

newSon:儿子1

newSon:儿子2

newSon:儿子3

newSon1:儿子1

newSon1:儿子2

newSon1:儿子3

注意

由上可知,虽然插入了一个新的,但是,getSons()获取的sons 并没有增加。

因为缓存在里面有列表对象,因此后续的关系get方法调用不查询数据库。

所以可以做以下操作。

//以下是getSons的代码
public List<Son> getSons() {
//为空,则重新查询
if (sons == null) {
final DaoSession daoSession = this.daoSession;
if (daoSession == null) {
throw new DaoException("Entity is detached from DAO context");
}
SonDao targetDao = daoSession.getSonDao();
List<Son> sonsNew = targetDao._queryFather_Sons(id);
synchronized (this) {
if(sons == null) {
sons = sonsNew;
}
}
} //否则返回以前的缓存
return sons;
}

要增加新的关联实体,需要手工将它们添加到源实体的一对多列表

			//插入
daoSession.insert(son); //再插入以后,应该为列表手工添加son
//手工添加
sons.add(son); for (Son newSon:
sons) {
System.out.println("newSon:"+newSon.getName());
} //重新获取
List<Son> sons1 = father.getSons(); for (Son newSon1:
sons1) {
System.out.println("newSon1:"+newSon1.getName());
}

运行结果

son:儿子1

son:儿子2

son:儿子3

newSon:儿子1

newSon:儿子2

newSon:儿子3

newSon:儿子4

newSon1:儿子1

newSon1:儿子2

newSon1:儿子3

newSon1:儿子4

或者

			//插入
daoSession.insert(son); //再插入以后
/使用重置方法来清除缓存列表
father.resetSons(); for (Son newSon:
sons) {
System.out.println("newSon:"+newSon.getName());
} //重新获取
List<Son> sons1 = father.getSons(); for (Son newSon1:
sons1) {
System.out.println("newSon1:"+newSon1.getName());
}

运行结果

son:儿子1

son:儿子2

son:儿子3

newSon:儿子1

newSon:儿子2

newSon:儿子3

newSon1:儿子1

newSon1:儿子2

newSon1:儿子3

newSon1:儿子4

由上可知

sons列表中没有添加上去,但是重新getSons()后,发现新插入的son已经加入了进去.

father.resetSons();由源码可知:

public synchronized void resetSons() {
sons = null;
}

sons为null了,所以当要getSons()时,因为son==null,所以会重新从数据库中重新查询数据。

当添加,更新或删除许多相关的实体可以使用重置方法来清除缓存列表。那么接下来get会重新查询相关实体:

GreenDao关系建表的更多相关文章

  1. Python3-sqlalchemy-orm 多对多关系建表、插入数据、查询数据

    现在来设计一个能描述"图书"与"作者"的关系的表结构,需求是 一本书可以有好几个作者一起出版 一个作者可以写好几本书 此时你会发现,用之前学的外键好像没办法实现 ...

  2. ORM对象关系映射之GreenDAO建立多表关联

    利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...

  3. (33)关于django中路由自带的admin + 建表关系的讲解

    admin是django自带的后台管理,在初始的时候就默认配置好了 当输入ip地址的时候后面跟admin,就会登陆管理员的后台,这个是django自带的,可以快速管理数据表(增删改查) PS:ip地址 ...

  4. EF简易教程,从建表到表间关系

    唐大兵博客 唐大兵的博客里记录了EF Code First从建表到表之间关系的详细内容. 汪杰的博客(EF里一对一.一对多.多对多关系的配置和级联删除) 汪杰的博客更简洁,但不够充实,读懂了唐大兵博客 ...

  5. Android ORM对象关系映射之GreenDAO建立多表关联

    https://blog.csdn.net/u010687392/article/details/48496299 利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数 ...

  6. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  7. Oracle建表

    1.oracle数据库中的多种数据结构: 1.表结构            存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...

  8. 关于MySQL建表

    规范一些常用字段. password:varchar name:varchar 时间存储全部存储时间戳,用bigint(20),拒绝使用 MySQL数据类型  mysql数据类型 含义 date 3字 ...

  9. Oracle 建表常用数据类型的详解

    创建表时,必须为表的各个列指定数据类型.如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存.如为学生指定出生日期为“1980-13-31”. 在Oracle中,常见的数据类型有: 字符串:字符 ...

随机推荐

  1. [转]10个有关RESTful API良好设计的最佳实践

    Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...

  2. vert.x学习(七),使用表单获取用户提交的数据

    在web开发中,用的最多的就是表单了,用户通过表单提交数据到系统后台,系统又可以通过表单传递的数据做业务分析.那么这章就学习在vert.x中怎么使用表单,获取表单的参数值. 编写一个表单模板代码res ...

  3. WordPress基础:让搜索引擎及时更新文章

    如果文章更新之后,想让搜索引擎也及时更新,你需要以下步骤 1.快速编辑文章时,勾选ping 2.设置->阅读,保证搜索引擎允许搜索 3.设置->撰写->添加url 通知url列表参考 ...

  4. 我的jsonp跨域问题

    关于jsonp跨域问题,在这个方面也是了解一点点,先记录下来,主要作为以后查看,之前下载并安装过wampserver,了解到了jsonp和json的区别,现在谈谈跨域这个问题: 首先什么是跨域,简单地 ...

  5. ubuntu 上安装字体

    http://www.360doc.com/content/11/0901/23/4171006_145128703.shtml http://www.linuxidc.com/Linux/2008- ...

  6. wordpres 自定义comment样式

    http://wange.im/diy-wordpress-comment-style.html function mytheme_comment($comment, $args, $depth) { ...

  7. golang 环境一键式配置

    在window下,通过以下bat,自动设置环境变量,启动终端,并cd到gopath目录 set goroot=c:\go set gopath=d:\go @start "start gol ...

  8. WINDOWS遠程常規化後再次切換回到全屏

    其实有更好的方法的,CTRI+Alt+Break,博主试试看

  9. 如何从投票的网站的管理后台导出已投票的邀请码数据至Excel,并且稍修改,再导入到现场抽奖软件中?

    第一步:进入投票网站的管理后台,导出 已投票 的 邀请码 相关信息至Excel中,下图所示: 并且 删除第一行表头汉字信息. 第二步:把第A列 数值 信息 转换 为 文本 信息(注:转换方法详细点击此 ...

  10. Eclipse开发快捷键技巧

    1.alt+?或alt+/:自动补全代码或者提示代码 这个是我最得意的快捷键组合了,尤其是当输入syso几个字符之后,2个手指轻松按下这2个键的时候,自动就补全System.out.println() ...