十一、BDB ManyToMany

本文介绍使用BdbJE实现班级与老师间多对多关系的存储方案。通过定义班级与老师实体类,建立相互之间的多对多关联,并演示如何进行数据的增删改查操作。

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

Bdb JE对复杂数据的存储(四)、ManyToMany关系的存储
班级类:

@Entity
public class Classs {
@PrimaryKey
String cId;

@SecondaryKey(relate=Relationship.MANY_TO_ONE)
String cName;

@SecondaryKey(relate=Relationship.MANY_TO_MANY,relatedEntity=Teacher.class,onRelatedEntityDelete=DeleteAction.NULLIFY)
Set<String> setTeacher=new HashSet<String>();

public Classs(){}

public Classs(String id,String name){
  this.cId=id;
  this.cName=name;
}
}
老师类:

@Entity
public class Teacher {

@PrimaryKey
String tId;

@SecondaryKey(relate=Relationship.MANY_TO_ONE)
String tName;

@SecondaryKey(relate=Relationship.MANY_TO_MANY,relatedEntity=Classs.class,onRelatedEntityDelete=DeleteAction.NULLIFY)
Set<String> setClasss=new HashSet<String>();

public Teacher(){}

public Teacher(String id,String name){
  this.tId=id;
  this.tName=name;
}
}

关系类:
public class Accessor {

PrimaryIndex<String, Classs> primaryClassById;
SecondaryIndex<String, String, Classs> classsByName;
SecondaryIndex<String, String, Classs> classsBySetTeacher;

PrimaryIndex<String, Teacher> primaryTeacherById;
SecondaryIndex<String, String, Teacher> teacherByName;
SecondaryIndex<String, String, Teacher> teacherByClasss;

Accessor(EntityStore store) throws DatabaseException{
  this.primaryClassById=store.getPrimaryIndex(String.class, Classs.class);
  this.classsByName=store.getSecondaryIndex(this.primaryClassById, String.class, "cName");
  this.classsBySetTeacher=store.getSecondaryIndex(this.primaryClassById, String.class, "setTeacher");
  
  this.primaryTeacherById=store.getPrimaryIndex(String.class, Teacher.class);
  this.teacherByName=store.getSecondaryIndex(this.primaryTeacherById, String.class, "tName");
  this.teacherByClasss=store.getSecondaryIndex(this.primaryTeacherById, String.class, "setClasss");
}
}
测试类:
public class testMany2Many {
public static void main(String[] args) {
  Environment env=null;
  EnvironmentConfig envconfig=new EnvironmentConfig();
  envconfig.setAllowCreate(true);
  envconfig.setTransactional(true);
  StoreConfig storeconfig=new StoreConfig();
  storeconfig.setAllowCreate(true);
  storeconfig.setTransactional(true);
  EntityStore store=null;
  try {
   env=new Environment(new File("D:/bdb/many2manyje"),envconfig);
   store=new EntityStore(env,"many2manyje",storeconfig);
   Accessor dao=new Accessor(store);
   PrimaryIndex<String, Classs> classsById=dao.primaryClassById;
   PrimaryIndex<String, Teacher> teacherById=dao.primaryTeacherById;
   Transaction txn=env.beginTransaction(null, null);
  
   Classs c1=new Classs("100001","三年一班");
   Classs c2=new Classs("100002","三年二班");
   Classs c3=new Classs("100003","三年三班");
  
   Classs c4=new Classs("100004","四年一班");
   Classs c5=new Classs("100005","四年二班");
   Classs c6=new Classs("100006","四年三班");
  
   Teacher t1=new Teacher("4200106310001","张微");
   Teacher t2=new Teacher("4200106310002","刘婷");
   Teacher t3=new Teacher("4200106310003","许红");
   Teacher t4=new Teacher("4200106310004","张珊");
   Teacher t5=new Teacher("4200106310005","周燕");
   Teacher t6=new Teacher("4200106310006","李蝶");
   Teacher t7=new Teacher("4200106310007","徐馨");
   Teacher t8=new Teacher("4200106310008","赵君");
   Teacher t9=new Teacher("4200106310009","刘可");
  
   Set<String> setT1=new HashSet<String>();
   setT1.add(t1.tId);
   setT1.add(t2.tId);
   setT1.add(t3.tId);
  
   Set<String> setT2=new HashSet<String>();
   setT2.add(t2.tId);
   setT2.add(t3.tId);
   setT2.add(t4.tId);
  
   Set<String> setT3=new HashSet<String>();
   setT3.add(t3.tId);
   setT3.add(t4.tId);
   setT3.add(t5.tId);
  
  
   Set<String> setT4=new HashSet<String>();
   setT4.add(t5.tId);
   setT4.add(t6.tId);
   setT4.add(t7.tId);
  
   Set<String> setT5=new HashSet<String>();
   setT5.add(t7.tId);
   setT5.add(t8.tId);
   setT5.add(t9.tId);
  
   c1.setTeacher=setT1;
   c2.setTeacher=setT2;
   c3.setTeacher=setT1;
   c4.setTeacher=setT3;
   c5.setTeacher=setT4;
   c6.setTeacher=setT5;
  
   teacherById.put(txn,t1);
   teacherById.put(txn,t2);
   teacherById.put(txn,t3);
   teacherById.put(txn,t4);
   teacherById.put(txn,t5);
   teacherById.put(txn,t6);
   teacherById.put(txn,t7);
   teacherById.put(txn,t8);
   teacherById.put(txn,t9);
  
   classsById.put(txn, c1);
   classsById.put(txn, c2);
   classsById.put(txn, c3);
   classsById.put(txn, c4);
   classsById.put(txn, c5);
   classsById.put(txn, c6);
  
  
   EntityCursor<Classs> ecClasss=null;
   EntityCursor<Teacher> ecTeacher=null;
  
   System.out.println("---------班级信息-------------------");
   ecClasss=classsById.entities(txn, null);
   for(Classs c:ecClasss){
    Iterator<String> it=c.setTeacher.iterator();
    StringBuffer strbuf=new StringBuffer();
    while(it.hasNext()){
     strbuf.append(teacherById.get(txn, it.next(), LockMode.DEFAULT).tName+" ");
    }
    System.out.println("班级ID:"+c.cId+" 班级名称:  "+c.cName+" 所属该班级的老师: "+strbuf.toString());
   }
   ecClasss.close();
   System.out.println("---------修改老师的所属班级信息-------------");
   ecTeacher=teacherById.entities(txn, null);
   for(Teacher t:ecTeacher){
    ecClasss=classsById.entities(txn, null);
    for(Classs c:ecClasss){
     if(c.setTeacher.contains(t.tId)){
      t.setClasss.add(c.cId);
     }
    }
    ecTeacher.update(t);
    ecClasss.close();
   }
   ecTeacher.close();
  
   System.out.println("----------老师信息----------");
   ecTeacher=teacherById.entities(txn, null);
   for(Teacher t:ecTeacher){
    Iterator<String> it=t.setClasss.iterator();
    StringBuffer strbuf=new StringBuffer();
    while(it.hasNext()){
     strbuf.append(classsById.get(txn,it.next(),LockMode.DEFAULT).cName+" ");
    }
    System.out.println("老师的ID "+t.tId+" 老师的名字: "+t.tName+" 老师所属班级: "+strbuf.toString());
   }
   ecTeacher.close();
   //在提交txn的时候最好有把所有的游标都要关闭
   txn.commit();
   store.close();
   env.cleanLog();
   env.close();
  } catch (EnvironmentLockedException e) {
   e.printStackTrace();
  } catch (DatabaseException e) {
   e.printStackTrace();
  }
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值