八、BDB OneToOne

来源:互联网 发布:linux创建逻辑卷 编辑:程序博客网 时间:2024/06/04 19:37
Bdb JE对复杂数据的存储

(一)、OneToOne关系的存储
我主要是通过每个人对应一个身份证号码,来实现OneToOne,我在删除人的时候我用到了级联。
人类:
@Entity
public class Person {
@PrimaryKey
int pid;
@SecondaryKey(relate = Relationship.MANY_TO_ONE)
String pname;
@SecondaryKey(relate = Relationship.ONE_TO_ONE,relatedEntity=IdCard.class,onRelatedEntityDelete=DeleteAction.CASCADE)
int id;
public Person() {
}
public Person(int pid, String name, int id) {
  this.pid = pid;
  this.pname = name;
  this.id = id;
}
}

身份证类:
@Entity
public class IdCard {
@PrimaryKey
int id;
@SecondaryKey(relate=Relationship.ONE_TO_ONE)
String idcard;

public IdCard(){}
public IdCard(int id,String idcard){
  this.id=id;
  this.idcard=idcard;
}
}
关系对应类:

public class PAccessor {
PrimaryIndex<Integer, Person> personByPId;
SecondaryIndex<String, Integer, Person> personByPName;
SecondaryIndex<Integer, Integer, Person> personById;
PrimaryIndex<Integer, IdCard> idcardById;
SecondaryIndex<String, Integer, IdCard> idcardByIdcard;
public PAccessor(EntityStore store) throws DatabaseException {
  personByPId = store.getPrimaryIndex(Integer.class, Person.class);
  personByPName = store.getSecondaryIndex(personByPId, String.class,
    "pname");
  personById = store.getSecondaryIndex(personByPId, Integer.class, "id");
  idcardById = store.getPrimaryIndex(Integer.class, IdCard.class);
  idcardByIdcard = store.getSecondaryIndex(idcardById, String.class,
    "idcard");
}
}

测试类:
public class testOne2One {

public static void main(String[] args) {
  EnvironmentConfig envConfig=new EnvironmentConfig();
  envConfig.setAllowCreate(true);
  envConfig.setTransactional(true);
  try {
//要在这新建文件哦
   Environment env=new Environment(new File("d://bdb//one2oneje"),envConfig);
   StoreConfig storeConfig=new StoreConfig();
   storeConfig.setAllowCreate(true);
   storeConfig.setTransactional(true);
   EntityStore store=new EntityStore(env,"PersonStore",storeConfig);
   PAccessor paccessor=new PAccessor(store);
   Transaction txn=env.beginTransaction(null, null);
   paccessor.idcardById.put(txn,new IdCard(1,"421023198709218315"));
   paccessor.idcardById.put(txn,new IdCard(2,"421023198710215927"));
   paccessor.idcardById.put(txn,new IdCard(3,"421023198708282315"));
   paccessor.idcardById.put(txn,new IdCard(4,"421123198708282315"));
   paccessor.idcardById.put(txn,new IdCard(5,"421223198708282315"));
   paccessor.personByPId.put(txn,new Person(1,"Bill",1));
   paccessor.personByPId.put(txn,new Person(2,"Mykey",3));
   paccessor.personByPId.put(txn,new Person(3,"Mykey",2));
   paccessor.personByPId.put(txn,new Person(4,"Match",4));
   paccessor.personByPId.put(txn,new Person(5,"Kill",5));
   txn.commit();
  
   String prefix = "persist#" + store.getStoreName() + "#";
   for(String name:env.getDatabaseNames()){
    if(name.startsWith(prefix)){
     System.out.println(name);
    }
   }
   System.out.println("输出人的信息包括省份证号码:");
   EntityCursor<Person> ec=paccessor.personByPId.entities();
   for(Person p:ec){
    System.out.println(p.pid+"  "+p.pname+"  "+paccessor.idcardById.get(p.id).idcard);
   }
   ec.close();
   System.out.println("修改ID为1的身份证号码:");
   IdCard idcard=paccessor.idcardById.get(1);
   idcard.idcard="421023198709218316";
   paccessor.idcardById.putNoReturn(idcard);
   System.out.println(paccessor.idcardById.get(1).idcard);
   System.out.println("///////修改ID为4人的姓名,可以通过游标来修改和删除entity///////");
   Person person=paccessor.personByPId.get(4);
   person.pname="berkeley";
   person.pname=person.pname.toUpperCase();
   paccessor.personByPId.putNoReturn(person);
   System.out.println(paccessor.personByPId.get(4).pname);
   System.out.println("/////////////查询名称为Mykey的所有人//////////////////////////");
   EntityJoin<Integer, Person> entityJoin=new EntityJoin<Integer, Person>(paccessor.personByPId);
   entityJoin.addCondition(paccessor.personByPName, "Mykey");
   //entityJoin.addCondition(paccessor.personById, 3);
   ForwardCursor<Person> f=entityJoin.entities();
   for(Person p:f){
    System.out.println(p.id+"   "+p.pid+"   "+p.pname);
   }
   f.close();
   System.out.println("************查询ID为1到4*****************");
   ec=paccessor.personByPId.entities(1, true, 4, true);
   for(Person p:ec){
    System.out.println(p.pid+"  "+p.pname+"  "+paccessor.idcardById.get(p.id).idcard);
   }
   ec.close();
   System.out.println("***********查询人的名称中有也M开头的**************");
   ec=paccessor.personByPName.entities("Mykey", true, "N", true);
   for(Person p:ec){
    System.out.println(p.pid+"  "+p.pname+"  "+paccessor.idcardById.get(p.id).idcard);
   }
   ec.close();
   System.out.println("------------------------");
   ec=paccessor.personByPName.subIndex("Mykey").entities();
   for(Person p:ec){
    System.out.println(p.pid+"  "+p.pname+"  "+paccessor.idcardById.get(p.id).idcard);
   }
   ec.close();
   System.out.println("************删除id为2的人******************");
   paccessor.personByPId.delete(2);
   System.out.println("输出人的信息包括省份证号码:");
   ec=paccessor.personByPId.entities();
   for(Person p:ec){
    System.out.println(p.pid+"  "+p.pname+"  "+paccessor.idcardById.get(p.id).idcard);
   }
   ec.close();
  
   store.close();
   env.cleanLog();
   env.close();
  }catch (Exception e) {
   e.printStackTrace();
  }
}

  

原创粉丝点击