GreenDao关系建表
关系
在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关系建表的更多相关文章
- Python3-sqlalchemy-orm 多对多关系建表、插入数据、查询数据
现在来设计一个能描述"图书"与"作者"的关系的表结构,需求是 一本书可以有好几个作者一起出版 一个作者可以写好几本书 此时你会发现,用之前学的外键好像没办法实现 ...
- ORM对象关系映射之GreenDAO建立多表关联
利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...
- (33)关于django中路由自带的admin + 建表关系的讲解
admin是django自带的后台管理,在初始的时候就默认配置好了 当输入ip地址的时候后面跟admin,就会登陆管理员的后台,这个是django自带的,可以快速管理数据表(增删改查) PS:ip地址 ...
- EF简易教程,从建表到表间关系
唐大兵博客 唐大兵的博客里记录了EF Code First从建表到表之间关系的详细内容. 汪杰的博客(EF里一对一.一对多.多对多关系的配置和级联删除) 汪杰的博客更简洁,但不够充实,读懂了唐大兵博客 ...
- Android ORM对象关系映射之GreenDAO建立多表关联
https://blog.csdn.net/u010687392/article/details/48496299 利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数 ...
- Hibernate多对多关系映射(建表)
下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...
- Oracle建表
1.oracle数据库中的多种数据结构: 1.表结构 存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...
- 关于MySQL建表
规范一些常用字段. password:varchar name:varchar 时间存储全部存储时间戳,用bigint(20),拒绝使用 MySQL数据类型 mysql数据类型 含义 date 3字 ...
- Oracle 建表常用数据类型的详解
创建表时,必须为表的各个列指定数据类型.如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存.如为学生指定出生日期为“1980-13-31”. 在Oracle中,常见的数据类型有: 字符串:字符 ...
随机推荐
- php 常见问题
empty(trim($str))报错原因 一个if判断如下: if (!empty(trim($a))) { ... } 报出如下错误: Fatal error: Can't use functio ...
- 引用log4j.jar包后,出现告警
问题现象:在引用log4j包后,使用自己导出的jar包,编译测试例代码,在启动浏览器时出现以下告警:log4j:WARN No appenders could be found for logger ...
- centos下JDK的卸载与安装
linux是自带JDK的,但是它自带的JDK是openJDK,我们如果需要安装ant之类的软件,使用这个JDK是不行的.所以我们需要卸载linux下自带的JDK,并安装我们准备的JDK. JDK的卸载 ...
- 个人理解java的继承
java的类是属于单继承的.在继承这一块上我本来有一个很大的误区,就是觉得父类中private定义的成员无法被继承.直到网上的大神给我指出private是可以被继承的,会在内存中,只是在子类的对象中不 ...
- Yii入门☞应用
Yii 应用的静态结构 应用: require可以有返回值,Yii中经常返回数组用以配置.以前只知道引用文件成功返回1. controllerMap属性允许你指定一个控制器ID到任意控制器类,修改配置 ...
- HTTP压缩
HTTP的压缩过程如下: 1.浏览器发送HTTP Request给Web服务器,Request中含有Accept-Encoding:gzip,deflate(告诉服务器支持的压缩格式): 2.Web服 ...
- Python学习【第七篇】基本数据类型
基本数据类型 数字 2是一个整数的例子. 长整数 不过是大一些的整数. 3.23和52.3E-4是浮点数的例子,E标记表示10的幂.在这里,52.3E-4表示52.3*10-4. (-5+4j)和(2 ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- JMeter学习(三十四)测试报告优化
如果按JMeter默认设置,生成报告如下: 从上图可以看出,结果信息比较简单,对于运行成功的case,还可以将就用着.但对于跑失败的case,就只有一行assert错误信息.(信息量太少了,比较难找到 ...