GreenDao笔记(二)

本文详细介绍使用GreenDao框架在Java环境下实现一对一、一对多及多对多的数据库表关联方式。通过具体代码实例展示了如何定义实体类并利用注解来描述复杂的表间关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GreenDao进阶笔记,通过 注解 JAVA 对象描述数据库表结构,以及实现一对多、多对多的联系,简单直接上代码,后面有详细说明

配置代码

@Entity
public class Soldier{ //人员表
    @Id(autoincrement = true)
    private Long sID;

    @Property
    private Long squadID;

    @ToOne(joinProperty = "squadID")
    private Squad squad;

    @Property
    private String sName;

    @ToMany
    @JoinEntity(entity = SoldierSentry.class,sourceProperty = "soldierId",targetProperty = "sentryId")
    private List<Sentry> sentryGroup;

    @Property
    private Integer grade;
}

@Entity
public class Sentry{ //岗位表
    @Id
    private Long sentry_id;
    @Property
    private String sentry_name;
    @Property
    private Integer sentry_type;
    @ToMany
    @JoinEntity(entity = SoldierSentry.class,sourceProperty = "sentryId",targetProperty = "soldierId")
    private List<Soldier> soldiers;
}

@Entity
public class SoldierSentry {//第三者,中间表
    @Id(autoincrement = true)
    private Long id;

    private Long soldierId;

    private Long sentryId;
}

@Entity
public class Squad{//班级表
    @Id(autoincrement = true)
    private Long suqadId;
    @Property
    private String squadName;

    @ToMany(referencedJoinProperty = "squadID")
    private List<Soldier> soldiers;
}

GreenDao框架一对一关联

greenDao环境配置不做赘述,直入正题  
示例代码中,soldier和squad的关系是一对一的,  
@ToOne中joinProperty属性是将属性值所代表的id指向当前所注解的实体类  
在Soldier中@ToOne 表示的是 将本身属性squadID 关联到Squad实体类

GreenDao框架一对多关联

示例代码中,squad和soldier的关系是一对多的,一个班可以拥有多个人员  
@ToMany中,referencedJoinProperty属性是将当前实体的属性关联到其对应的表上  
在Squad中@ToMany指的是将Squad当前属性soldiers 关联到Soldier表中的squadID上

GreenDao框架多对多关联

练手项目中,出现这么了一个多对多的关系,即一个人的能力对应多个岗位,一个岗位可以有多个人  
而greenDao是没有多对多的关联的,我们需要加入第三者JOIN表

中间表包含了人员和岗位的主键,用于建立两者之间多对多关系。  
分别将人员和岗位与中间表建立一对多的关系,并标明属性关系:  
@JoinEntity 内属性   
entity :第三者类文件   
sourceProperty:第三者中对应自身的id,在Soldier中是SoldierSentry内的soldierId,在Sentry中就是sentryId   
targetProperty:第三者中对应的需要关联的id,在Soldier中需要关联的为List<Sentry>集合,  
所以属性值为SoldierSentry内的sentryId。同理,Sentry中值就变成了soldierId。    

按照以上配置完成后 build 工程,运行测试代码(测试代码运行是初始化了部分数据的,但不影响逻辑):

@Test//测试一个岗位对应多个人员
public void testManyToMany() throws Exception {
  SentryDao sentryDao = MyApplication.getApplication().getDaoSession().getSentryDao();//不明白此处查看20170623日志
  Sentry sen = sentryDao.queryBuilder()
              .where(com.jaylee.duty.db.greendao.SentryDao.Properties.Sentry_id.eq(8L))//id为8的岗位
              .build()
              .unique();
    List<Soldier> s = sen.getSoldiers();//获取到可以胜任该岗位的所有人,查看实现细节可发现最后去查找了第三者表
    for (Soldier soldier : s) {
        Log.e("SQLTEST",soldier.toString());
    }
}
@Test
    public void testManyToMany() throws Exception {
        SoldierDao soldierDao = MyApplication.getApplication().getDaoSession().getSoldierDao();
        SoldierSentryDao soldierSentryDao = MyApplication.getApplication().getDaoSession().getSoldierSentryDao();
        List<SoldierSentry> sss = new ArrayList<>();
        sss.add(new SoldierSentry(null,41L,1L));
        sss.add(new SoldierSentry(null,41L,2L));
        sss.add(new SoldierSentry(null,41L,3L));
        sss.add(new SoldierSentry(null,41L,10L));
        sss.add(new SoldierSentry(null,41L,11L));
        sss.add(new SoldierSentry(null,41L,12L));
        soldierSentryDao.insertInTx(sss);   //向第三者表中添加id为41的人员的假数据
        Soldier sol = soldierDao.queryBuilder()
                                .where(SoldierDao.Properties.SID.eq(41L))//查询id为41的人员
                                .build()
                                .unique();
        List<Sentry> sentrys = sol.getSentryGroup();//获取该人员负责岗位
        for (Sentry sentry : sentrys) {
            Log.e("SQLTEST",sentry.toString());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值