十、ManyToOne的实现

BDB JE对复杂数据的储存 (三)、ManyToOne关系的存储

 


部门类:

 @Entity

public class Department {

    @PrimaryKey

    int departmentId;

    @SecondaryKey(relate=Relationship.ONE_TO_ONE)

    String departmentName;

    String location;

    public Department(int departmentId,String departmentName,String location){

       this.departmentId=departmentId;

       this.departmentName=departmentName;

       this.location=location;

    }

    Department(){ }

}

员工类:

@Entity

public class Employee {

    @PrimaryKey

    int employeeId;

    @SecondaryKey(relate=Relationship.MANY_TO_ONE)

    String employeeName;

    @SecondaryKey(relate=Relationship.MANY_TO_ONE)

    float salary;

@SecondaryKey

(relate=Relationship.MANY_TO_ONE,relatedEntity=Employee.class,onRelatedEntityDelete=DeleteActio

n.NULLIFY)

    Integer managerId;

@SecondaryKey

(relate=Relationship.MANY_TO_ONE,relatedEntity=Department.class,onRelatedEntityDelete=DeleteAct

ion.CASCADE)

    Integer departmentId;

    String address;

    public Employee(int employeeId,String employeeName,float salary,Integer managerId,int

departmentId,String address){

       this.employeeId=employeeId;

       this.employeeName=employeeName;

       this.salary=salary;

       this.managerId=managerId;

       this.departmentId=departmentId;

       this.address=address;

    }

    public Employee(){}

}

操作类:

public class Accessor {

    PrimaryIndex<Integer, Employee> employeeById;

    SecondaryIndex<String, Integer, Employee> employeeByName;

    SecondaryIndex<Float, Integer, Employee> employeeBySalary;

    SecondaryIndex<Integer, Integer, Employee> employeeByManagerId;

    SecondaryIndex<Integer, Integer, Employee> employeeByDepartmentId;

    PrimaryIndex<Integer, Department> departmentById;

    SecondaryIndex<String, Integer, Department> departmentByName;

    public Accessor(EntityStore store) throws DatabaseException{

       employeeById=store.getPrimaryIndex(Integer.class, Employee.class);

       employeeByName=store.getSecondaryIndex(employeeById, String.class, "employeeName");

       employeeBySalary=store.getSecondaryIndex(employeeById, Float.class, "salary");

       employeeByManagerId=store.getSecondaryIndex(employeeById, Integer.class, "managerId");

       employeeByDepartmentId=store.getSecondaryIndex(employeeById, Integer.class,

"departmentId");

       departmentById=store.getPrimaryIndex(Integer.class, Department.class);

       departmentByName=store.getSecondaryIndex(departmentById, String.class,

"departmentName");

    }

}

public class test {

 

    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//many2oneje2"),

                  envConfig);

           StoreConfig storeConfig = new StoreConfig();

           storeConfig.setAllowCreate(true);

           storeConfig.setTransactional(true);

           EntityStore store = new EntityStore(env, "EmployeeStore",

                  storeConfig);

           Accessor dao = new Accessor(store);

           Transaction txn = env.beginTransaction(null, null);

 

             dao.departmentById.put(txn,new

             Department(1,"CEO Office","North America"));

             dao.departmentById.put(txn,new Department(2,"Sales","EURO"));

             dao.departmentById.put(txn,new Department(3,"HR","MEA"));

             dao.departmentById.put(txn,new

             Department(4,"Engineering","APAC"));

             dao.departmentById.put(txn,new Department(5,"Support","LATAM"));

             dao.employeeById.put(txn,new

             Employee(1,"Abraham Lincoln",1000.0f,

             null,1,"Washington D.C.,USA")); dao.employeeById.put(txn,new

             Employee(2,"Augustus",9000.0f,1,2,"Rome,Italy"));

             dao.employeeById.put(txn,new

             Employee(3,"Cleopartra",7000.0f,1,3,"Cairo,Egypt"));

             dao.employeeById.put(txn,new

             Employee(4,"Confucius",7500.0f,1,4,"Beijing,China"));

             dao.employeeById.put(txn,new

             Employee(5,"Toussaint Louverture",6800.0f

             ,1,5,"Port-au-prince,Haiti")); dao.employeeById.put(txn,new

             Employee(6,"William Shakespeare",7300.0f,2,2,"London,Englad"));

             dao.employeeById.put(txn,new

             Employee(7,"Vistor Hugo",7000.0f,2,2,"paris,France"));

             dao.employeeById.put(txn,new

             Employee(8,"Yitzhak Rabin",6500.0f,3,3,"Jerusalem,Israel"));

             dao.employeeById.put(txn,new

             Employee(9,"Nelson Rolihlahla Mandela"

             ,6400.0f,3,3,"Cape Town,South Africa"));

             dao.employeeById.put(txn,new

             Employee(10,"Mei ji Emperor",6600.0f,4,4,"Tokyo,Japan"));

             dao.employeeById.put(txn,new

             Employee(11,"Mohandas Karamchand Gandhi"

             ,7600.0f,4,4,"New Delhi,India")); dao.employeeById.put(txn,new

             Employee

             (12,"Ayrton Senna da Silva",5600.0f,5,5,"Brasilia ,Brasil"));

             dao.employeeById.put(txn,new

             Employee(13,"Ronahlinho De Assis Moreiar"

             ,6100.0f,5,5,"Brasilia ,Brasil"));

           

 

           // 通过游标得到实体

           System.out.println("得到部门的信息,其按ID排序,升序");

           EntityCursor<Department> deptcursor = dao.departmentById.entities(

                  txn, null);

           for (Department dept : deptcursor) {

              System.out.println(dept.departmentId + "     "

                     + dept.departmentName);

           }

           deptcursor.close();

 

           System.out.println("得到部门的信息,其按部门名称排序,升序");

           deptcursor = dao.departmentByName.entities(txn, null);

           for (Department dept : deptcursor) {

              System.out.println(dept.departmentId + "     "

                     + dept.departmentName);

           }

           deptcursor.close();

           System.out.println("******************************");

           // 通过get得到实体

           System.out.println("得到部门id为1的信息");

           Department d = dao.departmentById.get(txn, 1, LockMode.DEFAULT);

           System.out.println(d.departmentId + "   " + d.departmentName);

           System.out.println("--------/------");

           // 通过关键字

           System.out.println("得到部门名称为sales的信息");

           d = dao.departmentByName.get(txn, "Sales", LockMode.DEFAULT);

           if (d != null) {

              System.out.println(d.departmentId + "   " + d.departmentName);

           }

           System.out.println("-------------------");

           // 限制游标的范围

           // 第一个参数代表为开始位置,按ACSII码查询,第二个参数代表(trur:>= false:>)

           // 第三个参数代表为结束位置,按ACSII码结束,其为一个字符的比较,第四个为(true:<=

false:<)

           deptcursor = dao.departmentByName.entities(txn, "C", true, "Sales",

                  true, null);

           for (Department dept : deptcursor) {

              System.out.println(dept.departmentName);

           }

           deptcursor.close();

 

           System.out.println("----------------------------");

 

           deptcursor = dao.departmentByName.subIndex("Sales").entities(txn,

                  null);

           for (Department dept : deptcursor) {

              System.out.println(dept.departmentId + "    "

                     + dept.departmentName);

           }

           deptcursor.close();

 

           System.out

                  .println("得到部门名为Sales,其ID为2的部门信息(如果get中为其他的值的时候都会报

错,因为部门名为Sales的部门ID为2)");

           d = dao.departmentByName.subIndex("Sales").get(txn, 2,

                  LockMode.DEFAULT);

           if (d != null) {

              System.out.println(d.departmentId + "   " + d.departmentName);

           }

           // dao.departmentById.delete(1);

           System.out

                  .println("");

           // 得到第一个部门的名称

           d = dao.departmentById.get(txn, 1, LockMode.DEFAULT);

           System.out.println(d.departmentName);

           System.out

                  .println("************************************************");

           // 得到部门ID为1的第一个员工的名字

           System.out.println("得到部门ID为2的第一个员工的名字:");

           System.out.println(dao.employeeByDepartmentId.get(txn, 2,

                  LockMode.DEFAULT).employeeName);

           System.out.println("+++++++++++++++++++++++++++++++++++++");

 

           System.out.println("查询工资在6000-8000之间的所有员工;");

           EntityCursor<Employee> ecursor = dao.employeeBySalary.entities(txn,

                  new Float(6000), true, new Float(8000), true, null);

           for (Employee e : ecursor) {

               System.out.println(e.employeeId + "    " + e.salary);

           }

           ecursor.close();

           System.out.println("-------------------");

           // 得到上司的编号为2的第一个员工的名称

           System.out.println("得到上司的编号为2的第一个员工的名称:");

           System.out.println(dao.employeeByManagerId.get(txn, 2,

                  LockMode.DEFAULT).employeeName);

           System.out

                  .println("------------------------------------------------------------------

---");

 

           // 查询公司的所有的员工

           System.out.println("查询公司的所有的员工:");

           System.out.println("编号    " + "名称" + "    " + "工资" + "   " + "地址"

                  + "      " + "部门ID" + "   " + "上司ID");

           EntityCursor<Employee> employeeCursor = dao.employeeById.entities(

                  txn, null);

 

           for (Employee e : employeeCursor) {

              System.out.println(e.employeeId + "  " + e.employeeName + " "

                     + e.salary + " " + e.address + "   " + e.departmentId

                     + "   " + e.managerId);

           }

           employeeCursor.close();

           System.out.println("---------------------");

           // 查询上司编号为1,并且工作为7000.0f的员工

           System.out.println("查询上司编号为1,并且工作为7000.0f的员工:");

 

           EntityJoin<Integer, Employee> entityJoin = new EntityJoin(

                  dao.employeeById);

           entityJoin.addCondition(dao.employeeByManagerId, 1);

           entityJoin.addCondition(dao.employeeBySalary, 7000.0f);

 

           ForwardCursor<Employee> c = entityJoin.entities(txn, null);

           for (Employee e : c) {

              System.out.println(e.employeeId + "   " + e.employeeName

                     + "   " + e.salary + "      " + e.managerId);

           }

           c.close();

           System.out.println("===========================================");

 

           // 联合查询(同一部门中的所有人员)

           System.out.println("部门名为Support中的所有人员");

           Department department = dao.departmentByName.get(txn, "Support",

                  LockMode.DEFAULT);

           if (department != null) {

              EntityCursor<Employee> ec = dao.employeeByDepartmentId

                     .subIndex(department.departmentId).entities(txn, null);

 

              for (Employee emp : ec) {

                  System.out.println(emp.employeeId + "   "

                         + emp.employeeName + "   " + emp.address);

              }

              ec.close();

           }

           System.out.println("相应的部门中所有员工显示:");

           EntityCursor<Department> deptc = dao.departmentById.entities(txn,

                  null);

           for (Department dd : deptc) {

              EntityCursor<Employee> eec = dao.employeeByDepartmentId

                     .subIndex(dd.departmentId).entities(txn, null);

              for (Employee emp : eec) {

                  System.out.println(emp.employeeId + "   "

                         + emp.employeeName + "   " + emp.address + "   "

                         + dd.departmentName);

              }

              eec.close();

           }

           deptc.close();

           System.out

                  .println("删除部门名为:Support,由于用到了CASCADE,在删除部门时,会把对应的部门

里的员工也会删除掉");

           deptc = dao.departmentById.entities(txn, null);

           for (Department dd : deptc) {

              if (dd.departmentName.trim().equals("Support")) {

                  // 最好用游标来进行删除和修改的操作

                  deptc.delete();

              }

              if (dd.departmentName.trim().equals("Sales")) {

                  dd.departmentName = dd.departmentName.toUpperCase();

                  deptc.update(dd);

              }

           }

           deptc.close();

           System.out.println("相应的部门中所有员工显示:");

           deptc = dao.departmentById.entities(txn, null);

           for (Department dd : deptc) {

              EntityCursor<Employee> eec = dao.employeeByDepartmentId

                     .subIndex(dd.departmentId).entities(txn, null);

              for (Employee emp : eec) {

                  System.out.println(emp.employeeId + "   "

                         + emp.employeeName + "   " + emp.address + "   "

                         + dd.departmentName);

              }

               eec.close();

           }

           deptc.close();

           store.close();

           txn.commit();

           env.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值