国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java的Hibernat框架中的Map映射與SortedMap映射

2019-11-26 14:44:54
字體:
供稿:網(wǎng)友

Map映射
Map映射是一個java集合存儲在鍵 - 值對的元素,并且不允許在列表中重復(fù)的元素。 Map接口提供三種collection視圖,允許Map內(nèi)容看作是一組鍵-值集合,或者設(shè)置鍵 - 值映射關(guān)系。

Map被映射到映射表中一個<map>元素和無序的地圖可以在java.util.HashMap中被初始化。

定義RDBMS表:
考慮一個情況,我們需要員工記錄存儲在EMPLOYEE表,將有以下結(jié)構(gòu):

create table EMPLOYEE (  id INT NOT NULL auto_increment,  first_name VARCHAR(20) default NULL,  last_name VARCHAR(20) default NULL,  salary   INT default NULL,  PRIMARY KEY (id));

此外,假設(shè)每個員工都可以有一個或多個與他/她相關(guān)的證書。我們將存儲證書的相關(guān)信息在一個單獨的表,該表具有以下結(jié)構(gòu):

create table CERTIFICATE (  id INT NOT NULL auto_increment,  certificate_type VARCHAR(40) default NULL,  certificate_name VARCHAR(30) default NULL,  employee_id INT default NULL,  PRIMARY KEY (id));

有一個對多(one-to-many )的關(guān)系在EMPLOYEE和證書對象之間。

定義POJO類:
讓我們實現(xiàn)一個POJO類員工將被用于保存與EMPLOYEE表中的對象和有證書的列表變量的集合。

import java.util.*;public class Employee {  private int id;  private String firstName;   private String lastName;    private int salary;  private Map certificates;  public Employee() {}  public Employee(String fname, String lname, int salary) {   this.firstName = fname;   this.lastName = lname;   this.salary = salary;  }  public int getId() {   return id;  }  public void setId( int id ) {   this.id = id;  }  public String getFirstName() {   return firstName;  }  public void setFirstName( String first_name ) {   this.firstName = first_name;  }  public String getLastName() {   return lastName;  }  public void setLastName( String last_name ) {   this.lastName = last_name;  }  public int getSalary() {   return salary;  }  public void setSalary( int salary ) {   this.salary = salary;  }  public Map getCertificates() {   return certificates;  }  public void setCertificates( Map certificates ) {   this.certificates = certificates;  }}

我們需要相應(yīng)的證書表定義另一個POJO類,這樣的證書對象可以存儲和檢索到的證書表。

public class Certificate{  private int id;  private String name;   public Certificate() {}  public Certificate(String name) {   this.name = name;  }  public int getId() {   return id;  }  public void setId( int id ) {   this.id = id;  }  public String getName() {   return name;  }  public void setName( String name ) {   this.name = name;  }}

定義Hibernate映射文件:
讓我們開發(fā)指示Hibernate如何定義的類映射到數(shù)據(jù)庫表的映射文件。<map>元素將被用于定義所使用的映射的規(guī)則。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>  <class name="Employee" table="EMPLOYEE">   <meta attribute="class-description">     This class contains the employee detail.    </meta>   <id name="id" type="int" column="id">     <generator class="native"/>   </id>   <map name="certificates" cascade="all">     <key column="employee_id"/>     <index column="certificate_type" type="string"/>     <one-to-many class="Certificate"/>   </map>   <property name="firstName" column="first_name" type="string"/>   <property name="lastName" column="last_name" type="string"/>   <property name="salary" column="salary" type="int"/>  </class>  <class name="Certificate" table="CERTIFICATE">   <meta attribute="class-description">     This class contains the certificate records.    </meta>   <id name="id" type="int" column="id">     <generator class="native"/>   </id>   <property name="name" column="certificate_name" type="string"/>  </class></hibernate-mapping>

應(yīng)該保存的映射文件中的格式<classname>.hbm.xml。我們保存映射文件中的文件Employee.hbm.xml。已經(jīng)熟悉了大部分的映射細節(jié),但讓我們再次看映射文件中的所有元素:

映射文檔是具有<hibernate-mapping>為對應(yīng)于每一個類包含2個<class>元素的根元素的XML文檔。

<class>元素被用于定義數(shù)據(jù)庫表從一個Java類特定的映射。 Java類名指定使用class元素的name屬性和使用表屬性數(shù)據(jù)庫表名指定。

<meta>元素是可選元素,可以用來創(chuàng)建類的描述。

<id>元素映射在類中的唯一ID屬性到數(shù)據(jù)庫表的主鍵。 id元素的name屬性是指屬性的類和column屬性是指在數(shù)據(jù)庫表中的列。 type屬性保存了Hibernate映射類型,這種類型的映射將會從Java轉(zhuǎn)換為SQL數(shù)據(jù)類型。

id元素內(nèi)的<generator>元素被用來自動生成的主鍵值。將生成元素的class屬性設(shè)置為原產(chǎn)于讓Hibernate拿起無論是identity,sequence或者hilo中的算法來創(chuàng)建主鍵根據(jù)底層數(shù)據(jù)庫的支持能力。

<property>元素用于一個Java類的屬性映射到數(shù)據(jù)庫表中的列。元素的name屬性是指屬性的類和column屬性是指在數(shù)據(jù)庫表中的列。 type屬性保存了Hibernate映射類型,這種類型的映射將會從Java轉(zhuǎn)換為SQL數(shù)據(jù)類型。

<map>元素用于設(shè)置證書和Employee類之間的關(guān)系。我們使用cascade屬性的<map>元素來告訴Hibernate來保存證書的對象,同時為Employee對象。 name屬性設(shè)置為定義Mapvariable在父類中,在我們的案例中是證書。

<index>的元素用于表示鍵/值對地圖的關(guān)鍵部位。該鍵將使用一個字符串類型的存儲在列certificate_type。

<key>元素是包含外鍵的父對象,即在證書表中的列。表EMPLOYEE。

<one-to-many>元素表示一個Employee對象涉及到很多證書的對象,并因此,證書對象必須有與Employee父類有關(guān)。可以根據(jù)需要使用<one-to-one>,<many-to-one>或<many-to-many>這個元素。

創(chuàng)建應(yīng)用程序類:
最后,創(chuàng)建應(yīng)用程序類的main()方法來運行應(yīng)用程序。使用這個應(yīng)用程序來保存員工記錄地連同證書列表,然后在應(yīng)用上執(zhí)行CRUD操作上的記錄。

import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class ManageEmployee {  private static SessionFactory factory;   public static void main(String[] args) {   try{     factory = new Configuration().configure().buildSessionFactory();   }catch (Throwable ex) {      System.err.println("Failed to create sessionFactory object." + ex);     throw new ExceptionInInitializerError(ex);    }   ManageEmployee ME = new ManageEmployee();   /* Let us have a set of certificates for the first employee */   HashMap set = new HashMap();   set.put("ComputerScience", new Certificate("MCA"));   set.put("BusinessManagement", new Certificate("MBA"));   set.put("ProjectManagement", new Certificate("PMP"));      /* Add employee records in the database */   Integer empID = ME.addEmployee("Manoj", "Kumar", 4000, set);   /* List down all the employees */   ME.listEmployees();   /* Update employee's salary records */   ME.updateEmployee(empID, 5000);   /* List down all the employees */   ME.listEmployees();  }  /* Method to add an employee record in the database */  public Integer addEmployee(String fname, String lname,                    int salary, HashMap cert){   Session session = factory.openSession();   Transaction tx = null;   Integer employeeID = null;   try{     tx = session.beginTransaction();     Employee employee = new Employee(fname, lname, salary);     employee.setCertificates(cert);     employeeID = (Integer) session.save(employee);      tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }   return employeeID;  }  /* Method to list all the employees detail */  public void listEmployees( ){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     List employees = session.createQuery("FROM Employee").list();      for (Iterator iterator1 =               employees.iterator(); iterator1.hasNext();){      Employee employee = (Employee) iterator1.next();       System.out.print("First Name: " + employee.getFirstName());       System.out.print(" Last Name: " + employee.getLastName());       System.out.println(" Salary: " + employee.getSalary());      Map ec = employee.getCertificates();      System.out.println("Certificate: " +        (((Certificate)ec.get("ComputerScience")).getName()));      System.out.println("Certificate: " +        (((Certificate)ec.get("BusinessManagement")).getName()));      System.out.println("Certificate: " +        (((Certificate)ec.get("ProjectManagement")).getName()));     }     tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }  /* Method to update salary for an employee */  public void updateEmployee(Integer EmployeeID, int salary ){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     Employee employee =           (Employee)session.get(Employee.class, EmployeeID);      employee.setSalary( salary );     session.update(employee);     tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }  /* Method to delete an employee from the records */  public void deleteEmployee(Integer EmployeeID){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     Employee employee =           (Employee)session.get(Employee.class, EmployeeID);      session.delete(employee);      tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }}

編譯和執(zhí)行:
下面是步驟來編譯并運行上述應(yīng)用程序。請確保您已在進行的編譯和執(zhí)行之前,已經(jīng)適當(dāng)?shù)卦O(shè)置PATH和CLASSPATH。

  • 創(chuàng)建hibernate.cfg.xml配置文件,在配置章節(jié)已經(jīng)解釋和學(xué)習(xí)。
  • 創(chuàng)建Employee.hbm.xml映射文件,如上圖所示。
  • 創(chuàng)建Employee.java源文件,如上圖所示,并編譯它。
  • 創(chuàng)建Certificate.java源文件,如上圖所示,并編譯它。
  • 創(chuàng)建ManageEmployee.java源文件,如上圖所示,并編譯它。
  • 執(zhí)行ManageEmployee二進制文件來運行程序。

會在屏幕上獲得以下結(jié)果,并同時創(chuàng)建記錄在員工和證書表。

$java ManageEmployee

.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........

First Name: Manoj Last Name: Kumar Salary: 4000Certificate: MCACertificate: MBACertificate: PMPFirst Name: Manoj Last Name: Kumar Salary: 5000Certificate: MCACertificate: MBACertificate: PMP

如果檢查員工和證書表,就應(yīng)該記錄下了:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+| id | first_name | last_name | salary |+----+------------+-----------+--------+| 60 | Manoj   | Kumar   |  5000 |+----+------------+-----------+--------+1 row in set (0.00 sec)
mysql>select * from CERTIFICATE;
+----+--------------------+------------------+-------------+| id | certificate_type  | certificate_name | employee_id |+----+--------------------+------------------+-------------+| 16 | ProjectManagement | PMP       |     60 || 17 | BusinessManagement | MBA       |     60 || 18 | ComputerScience  | MCA       |     60 |+----+--------------------+------------------+-------------+3 rows in set (0.00 sec)


SortedMap映射
SortedMap是存儲在鍵 - 值對的元素,并提供鍵的總體排序類似java的集合作為映射。重復(fù)的元素未在映射不允許的。該映射是根據(jù)其鍵的自然順序進行排序,或者通過提供通常在有序映射的創(chuàng)建時間比較。

SortedMap被映射在該映射表中的<map>元素和有序映射可以在java.util.TreeMap中被初始化。
我們依然使用上面定義的RDBMS表和POJO類來講下面的例子:
定義Hibernate映射文件:
讓我們開發(fā)指示Hibernate如何定義的類映射到數(shù)據(jù)庫表的映射文件。<map>元素將被用于定義所使用的映射的規(guī)則。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>  <class name="Employee" table="EMPLOYEE">   <meta attribute="class-description">     This class contains the employee detail.    </meta>   <id name="id" type="int" column="id">     <generator class="native"/>   </id>   <map name="certificates" cascade="all" sort="MyClass">     <key column="employee_id"/>     <index column="certificate_type" type="string"/>     <one-to-many class="Certificate"/>   </map>   <property name="firstName" column="first_name" type="string"/>   <property name="lastName" column="last_name" type="string"/>   <property name="salary" column="salary" type="int"/>  </class>  <class name="Certificate" table="CERTIFICATE">   <meta attribute="class-description">     This class contains the certificate records.    </meta>   <id name="id" type="int" column="id">     <generator class="native"/>   </id>   <property name="name" column="certificate_name" type="string"/>  </class></hibernate-mapping>

應(yīng)該保存的映射文件中的格式<classname>.hbm.xml。我們保存映射文件Employee.hbm.xml。前面已經(jīng)熟悉了大部分的映射細節(jié),但讓我們再次看看映射文件中的所有元素:

映射文檔是具有<hibernate-mapping>對應(yīng)于每一個類包含2個<class>元素的根元素的XML文檔。

<class>元素被用于定義數(shù)據(jù)庫表從一個Java類特定的映射。 Java類名指定使用class元素的name屬性和使用表屬性數(shù)據(jù)庫表名指定。

<meta>元素是可選元素,可以用來創(chuàng)建類的描述。

<id>元素映射在類中的唯一ID屬性到數(shù)據(jù)庫表的主鍵。 id元素的name屬性是指屬性的類和column屬性是指在數(shù)據(jù)庫表中的列。 type屬性保存了Hibernate映射類型,這種類型的映射將會從Java轉(zhuǎn)換為SQL數(shù)據(jù)類型。

id元素內(nèi)的<generator>元素被用來自動生成的主鍵值。將生成元素的class屬性設(shè)置讓Hibernate對應(yīng)于identity,sequence或者hilo中的算法來創(chuàng)建主鍵根據(jù)底層數(shù)據(jù)庫的支持能力。

<property>元素用于一個Java類的屬性映射到數(shù)據(jù)庫表中的列。元素的name屬性是指屬性的類和column屬性是指在數(shù)據(jù)庫表中的列。 type屬性保存了Hibernate映射類型,這種類型的映射將會從Java轉(zhuǎn)換為SQL數(shù)據(jù)類型。

<map>元素用于設(shè)置證書和Employee類之間的關(guān)系。我們使用cascade屬性的<map>元素來告訴Hibernate來保存證書的對象,同時為Employee對象。 name屬性被設(shè)置為在父類中的定義的SortedMap變量,在我們的情況下,它是證書。排序?qū)傩钥梢栽O(shè)置為自然有自然排序,也可以設(shè)置為自定義類實現(xiàn)為java.util.Comparator。我們已經(jīng)使用了一個類MyClass,它實現(xiàn)為java.util.Comparator扭轉(zhuǎn)證書類實現(xiàn)的排序順序。

<index>元素用于表示鍵/值對映射的鍵部分。該鍵將使用一個字符串類型的存儲在列certificate_type。

<key>元素是包含外鍵的父對象,即在證書表中的列。表EMPLOYEE。

<one-to-many>元素表示一個Employee對象涉及到很多證書的對象,并因此,證書對象必須有與Employee父有關(guān)聯(lián)。可以根據(jù)需要使用<one-to-one>,<many-to-one>或<many-to-many>這個元素。

如果使用sort="natural",然后我們并不需要創(chuàng)建一個單獨的類,因為證書類已經(jīng)實現(xiàn)了Comparable接口和hibernate會使用compareTo在證書類定義為比較的SortedMap()方法。但是,我們使用的是在我們的映射文件自定義的比較器類MyClass,所以我們必須創(chuàng)建這個類的基礎(chǔ)上我們的排序算法。讓我們做降在映射上可用的按鍵排序。

import java.util.Comparator;public class MyClass implements Comparator <String>{  public int compare(String o1, String o2) {   final int BEFORE = -1;   final int AFTER = 1;   /* To reverse the sorting order, multiple by -1 */   if (o2 == null) {     return BEFORE * -1;   }   Comparable thisCertificate = o1;   Comparable thatCertificate = o2;   if(thisCertificate == null) {     return AFTER * 1;   } else if(thatCertificate == null) {     return BEFORE * -1;   } else {     return thisCertificate.compareTo(thatCertificate) * -1;   }  }}

最后,我們將創(chuàng)建應(yīng)用程序類的main()方法來運行應(yīng)用程序。我們將使用這個應(yīng)用程序,以節(jié)省一些員工的記錄地連同的證書,然后我們將提交CRUD操作上面的記錄。

import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class ManageEmployee {  private static SessionFactory factory;   public static void main(String[] args) {   try{     factory = new Configuration().configure().buildSessionFactory();   }catch (Throwable ex) {      System.err.println("Failed to create sessionFactory object." + ex);     throw new ExceptionInInitializerError(ex);    }   ManageEmployee ME = new ManageEmployee();   /* Let us have a set of certificates for the first employee */   TreeMap set1 = new TreeMap();   set1.put("ComputerScience", new Certificate("MCA"));   set1.put("BusinessManagement", new Certificate("MBA"));   set1.put("ProjectManagement", new Certificate("PMP"));    /* Add employee records in the database */   Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);   /* Another set of certificates for the second employee */   TreeMap set2 = new TreeMap();   set2.put("ComputerScience", new Certificate("MCA"));   set2.put("BusinessManagement", new Certificate("MBA"));   /* Add another employee record in the database */   Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);   /* List down all the employees */   ME.listEmployees();   /* Update employee's salary records */   ME.updateEmployee(empID1, 5000);   /* Delete an employee from the database */   ME.deleteEmployee(empID2);   /* List down all the employees */   ME.listEmployees();  }  /* Method to add an employee record in the database */  public Integer addEmployee(String fname, String lname,                    int salary, TreeMap cert){   Session session = factory.openSession();   Transaction tx = null;   Integer employeeID = null;   try{     tx = session.beginTransaction();     Employee employee = new Employee(fname, lname, salary);     employee.setCertificates(cert);     employeeID = (Integer) session.save(employee);      tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }   return employeeID;  }  /* Method to list all the employees detail */  public void listEmployees( ){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     List employees = session.createQuery("FROM Employee").list();      for (Iterator iterator1 =               employees.iterator(); iterator1.hasNext();){      Employee employee = (Employee) iterator1.next();       System.out.print("First Name: " + employee.getFirstName());       System.out.print(" Last Name: " + employee.getLastName());       System.out.println(" Salary: " + employee.getSalary());      SortedMap<String, Certificate> map =                         employee.getCertificates();      for(Map.Entry<String,Certificate> entry : map.entrySet()){        System.out.print("/tCertificate Type: " + entry.getKey());        System.out.println(", Name: " +                     (entry.getValue()).getName());      }     }     tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }  /* Method to update salary for an employee */  public void updateEmployee(Integer EmployeeID, int salary ){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     Employee employee =           (Employee)session.get(Employee.class, EmployeeID);      employee.setSalary( salary );     session.update(employee);     tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }  /* Method to delete an employee from the records */  public void deleteEmployee(Integer EmployeeID){   Session session = factory.openSession();   Transaction tx = null;   try{     tx = session.beginTransaction();     Employee employee =           (Employee)session.get(Employee.class, EmployeeID);      session.delete(employee);      tx.commit();   }catch (HibernateException e) {     if (tx!=null) tx.rollback();     e.printStackTrace();    }finally {     session.close();    }  }}

編譯和執(zhí)行: 
可以看到證書已排序順序相反。可以通過改變映射文件試試,只需設(shè)置sort="natural"和執(zhí)行程序,并比較結(jié)果。

$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........First Name: Manoj Last Name: Kumar Salary: 4000 Certificate Type: ProjectManagement, Name: PMP Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBAFirst Name: Dilip Last Name: Kumar Salary: 3000 Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBAFirst Name: Manoj Last Name: Kumar Salary: 5000 Certificate Type: ProjectManagement, Name: PMP Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBA

如果檢查員工和證書表,就應(yīng)該記錄下了:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+| id | first_name | last_name | salary |+----+------------+-----------+--------+| 74 | Manoj   | Kumar   |  5000 |+----+------------+-----------+--------+1 row in set (0.00 sec)
mysql> select * from CERTIFICATE;
+----+--------------------+------------------+-------------+| id | certificate_type  | certificate_name | employee_id |+----+--------------------+------------------+-------------+| 52 | BusinessManagement | MBA       |     74 || 53 | ComputerScience  | MCA       |     74 || 54 | ProjectManagement | PMP       |     74 |+----+--------------------+------------------+-------------+3 rows in set (0.00 sec)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 清徐县| 萍乡市| 瓮安县| 松滋市| 义马市| 盐城市| 修水县| 凌云县| 余江县| 特克斯县| 临清市| 津南区| 临海市| 锡林浩特市| 揭阳市| 黄大仙区| 丰宁| 合山市| 崇仁县| 洛浦县| 繁昌县| 南昌市| 兰溪市| 会昌县| 嵩明县| 永宁县| 怀集县| 合水县| 乡城县| 长宁县| 岑巩县| 太康县| 西吉县| 诸暨市| 突泉县| 家居| 平原县| 鲁甸县| 星座| 台湾省| 合水县|