详解Java的Hibernat框架中的Map映射与SortedMap映射

Map映射
Map映射是一个java集合存储在键 - 值对的元素,并且不允许在列表中重复的元素。 Map接口提供三种collection视图,允许Map内容看作是一组键-值集合,或者设置键 - 值映射关系。

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

定义RDBMS表:
考虑一个情况,我们需要员工记录存储在EMPLOYEE表,将有以下结构:

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)
);

此外,假设每个员工都可以有一个或多个与他/她相关的证书。我们将存储证书的相关信息在一个单独的表,该表具有以下结构:

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 )的关系在EMPLOYEE和证书对象之间。

定义POJO类:
让我们实现一个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;
  }
}

我们需要相应的证书表定义另一个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映射文件:
让我们开发指示Hibernate如何定义的类映射到数据库表的映射文件。<map>元素将被用于定义所使用的映射的规则。

<?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>

应该保存的映射文件中的格式<classname>.hbm.xml。我们保存映射文件中的文件Employee.hbm.xml。已经熟悉了大部分的映射细节,但让我们再次看映射文件中的所有元素:

映射文档是具有<hibernate-mapping>为对应于每一个类包含2个<class>元素的根元素的XML文档。

<class>元素被用于定义数据库表从一个Java类特定的映射。 Java类名指定使用class元素的name属性和使用表属性数据库表名指定。

<meta>元素是可选元素,可以用来创建类的描述。

<id>元素映射在类中的唯一ID属性到数据库表的主键。 id元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了Hibernate映射类型,这种类型的映射将会从Java转换为SQL数据类型。

id元素内的<generator>元素被用来自动生成的主键值。将生成元素的class属性设置为原产于让Hibernate拿起无论是identity,sequence或者hilo中的算法来创建主键根据底层数据库的支持能力。

<property>元素用于一个Java类的属性映射到数据库表中的列。元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了Hibernate映射类型,这种类型的映射将会从Java转换为SQL数据类型。

<map>元素用于设置证书和Employee类之间的关系。我们使用cascade属性的<map>元素来告诉Hibernate来保存证书的对象,同时为Employee对象。 name属性设置为定义Mapvariable在父类中,在我们的案例中是证书。

<index>的元素用于表示键/值对地图的关键部位。该键将使用一个字符串类型的存储在列certificate_type。

<key>元素是包含外键的父对象,即在证书表中的列。表EMPLOYEE。

<one-to-many>元素表示一个Employee对象涉及到很多证书的对象,并因此,证书对象必须有与Employee父类有关。可以根据需要使用<one-to-one>,<many-to-one>或<many-to-many>这个元素。

创建应用程序类:
最后,创建应用程序类的main()方法来运行应用程序。使用这个应用程序来保存员工记录地连同证书列表,然后在应用上执行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();
   }
  }
}

编译和执行:
下面是步骤来编译并运行上述应用程序。请确保您已在进行的编译和执行之前,已经适当地设置PATH和CLASSPATH。

  • 创建hibernate.cfg.xml配置文件,在配置章节已经解释和学习。
  • 创建Employee.hbm.xml映射文件,如上图所示。
  • 创建Employee.java源文件,如上图所示,并编译它。
  • 创建Certificate.java源文件,如上图所示,并编译它。
  • 创建ManageEmployee.java源文件,如上图所示,并编译它。
  • 执行ManageEmployee二进制文件来运行程序。

会在屏幕上获得以下结果,并同时创建记录在员工和证书表。

$java ManageEmployee

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

First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MCA
Certificate: MBA
Certificate: PMP
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MCA
Certificate: MBA
Certificate: PMP

如果检查员工和证书表,就应该记录下了:

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的集合作为映射。重复的元素未在映射不允许的。该映射是根据其键的自然顺序进行排序,或者通过提供通常在有序映射的创建时间比较。

SortedMap被映射在该映射表中的<map>元素和有序映射可以在java.util.TreeMap中被初始化。
我们依然使用上面定义的RDBMS表和POJO类来讲下面的例子:
定义Hibernate映射文件:
让我们开发指示Hibernate如何定义的类映射到数据库表的映射文件。<map>元素将被用于定义所使用的映射的规则。

<?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>

应该保存的映射文件中的格式<classname>.hbm.xml。我们保存映射文件Employee.hbm.xml。前面已经熟悉了大部分的映射细节,但让我们再次看看映射文件中的所有元素:

映射文档是具有<hibernate-mapping>对应于每一个类包含2个<class>元素的根元素的XML文档。

<class>元素被用于定义数据库表从一个Java类特定的映射。 Java类名指定使用class元素的name属性和使用表属性数据库表名指定。

<meta>元素是可选元素,可以用来创建类的描述。

<id>元素映射在类中的唯一ID属性到数据库表的主键。 id元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了Hibernate映射类型,这种类型的映射将会从Java转换为SQL数据类型。

id元素内的<generator>元素被用来自动生成的主键值。将生成元素的class属性设置让Hibernate对应于identity,sequence或者hilo中的算法来创建主键根据底层数据库的支持能力。

<property>元素用于一个Java类的属性映射到数据库表中的列。元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了Hibernate映射类型,这种类型的映射将会从Java转换为SQL数据类型。

<map>元素用于设置证书和Employee类之间的关系。我们使用cascade属性的<map>元素来告诉Hibernate来保存证书的对象,同时为Employee对象。 name属性被设置为在父类中的定义的SortedMap变量,在我们的情况下,它是证书。排序属性可以设置为自然有自然排序,也可以设置为自定义类实现为java.util.Comparator。我们已经使用了一个类MyClass,它实现为java.util.Comparator扭转证书类实现的排序顺序。

<index>元素用于表示键/值对映射的键部分。该键将使用一个字符串类型的存储在列certificate_type。

<key>元素是包含外键的父对象,即在证书表中的列。表EMPLOYEE。

<one-to-many>元素表示一个Employee对象涉及到很多证书的对象,并因此,证书对象必须有与Employee父有关联。可以根据需要使用<one-to-one>,<many-to-one>或<many-to-many>这个元素。

如果使用sort="natural",然后我们并不需要创建一个单独的类,因为证书类已经实现了Comparable接口和hibernate会使用compareTo在证书类定义为比较的SortedMap()方法。但是,我们使用的是在我们的映射文件自定义的比较器类MyClass,所以我们必须创建这个类的基础上我们的排序算法。让我们做降在映射上可用的按键排序。

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;
   }
  }
}

最后,我们将创建应用程序类的main()方法来运行应用程序。我们将使用这个应用程序,以节省一些员工的记录地连同的证书,然后我们将提交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();
   }
  }
}

编译和执行: 
可以看到证书已排序顺序相反。可以通过改变映射文件试试,只需设置sort="natural"和执行程序,并比较结果。

$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: MBA
First Name: Dilip Last Name: Kumar Salary: 3000
 Certificate Type: ComputerScience, Name: MCA
 Certificate Type: BusinessManagement, Name: MBA
First Name: Manoj Last Name: Kumar Salary: 5000
 Certificate Type: ProjectManagement, Name: PMP
 Certificate Type: ComputerScience, Name: MCA
 Certificate Type: BusinessManagement, Name: MBA

如果检查员工和证书表,就应该记录下了:

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)
(0)

相关推荐

  • 详解Java的Hibernate框架中的List映射表与Bag映射

    List映射表 List列表是一个java集合存储在序列中的元素,并允许重复的元素.此接口的用户可以精确地控制,其中列表中的每个元素插入.用户可以通过他们的整数索引访问元素,并搜索列表中的元素.更正式地说,列表通常允许对元素e1和e2,使得e1.equals(e2),它们通常允许多个null元素,如果他们允许的null元素. List列表被映射在该映射表中的<list>元素,并将java.util.ArrayList中初始化. 定义RDBMS表: 考虑一个情况,需要员工记录存储在EMPLOYE

  • 解析Java的Hibernate框架中的持久化类和映射文件

    持久化类 Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内H

  • 详解Java的Hibernate框架中的注解与缓存

    注解 Hibernate注解是一个没有使用XML文件来定义映射的最新方法.可以在除或替换的XML映射元数据使用注解. Hibernate的注解是强大的方式来提供元数据对象和关系表的映射.所有的元数据被杵到一起的代码POJO java文件这可以帮助用户在开发过程中同时要了解表的结构和POJO. 如果打算让应用程序移植到其他EJB3规范的ORM应用程序,必须使用注解来表示映射信息,但仍然如果想要更大的灵活性,那么应该使用基于XML的映射去. 环境设置Hibernate注释 首先,必须确保使用的是JD

  • 详解Java的Hibernat框架中的Map映射与SortedMap映射

    Map映射 Map映射是一个java集合存储在键 - 值对的元素,并且不允许在列表中重复的元素. Map接口提供三种collection视图,允许Map内容看作是一组键-值集合,或者设置键 - 值映射关系. Map被映射到映射表中一个<map>元素和无序的地图可以在java.util.HashMap中被初始化. 定义RDBMS表: 考虑一个情况,我们需要员工记录存储在EMPLOYEE表,将有以下结构: create table EMPLOYEE ( id INT NOT NULL auto_i

  • 详解Java的Hibernate框架中的Interceptor和Collection

    Interceptor 讲到Interceptor,相信熟悉struts2的童鞋肯定不会陌生了,struts2可以自定义拦截器进行自己想要的一系列相关的工作.而这里我们说的Interceptor也是差不多相似的功能.  废话不说,直接来代码:  下面这个是MyInterceptor类,它实现了Interceptor接口: public String onPrepareStatement(String arg0) { return arg0; } public boolean onSave(Obj

  • 详解Java的Hibernate框架中的set映射集与SortedSet映射

    Set 集合Set是一个java集合不包含任何重复的元素.更正式地说,Set不包含任何元素对e1和e2,使得e1.equals(e2),和至多一个空元素.所以被添加到一组对象必须实现equals()和hashCode()方法,使Java可以判断任何两个元素/对象是否是相同的. 集被映射到与映射表中<set>元素,并在java.util.HashSet中初始化.可以使用Set集合在类时,有一个集合中不需要重复的元素. 定义RDBMS表: 考虑一个情况下,我们需要我们的员工记录存储在EMPLOYE

  • 详解Java的Spring框架中的事务管理方式

    数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

  • 详解Java的MyBatis框架中的事务处理

    一.MyBatis单独使用时,使用SqlSession来处理事务: public class MyBatisTxTest { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; @BeforeClass public static void setUpBeforeClass() throws Exception { try { reader = Resources.getResourc

  • 详解Java的MyBatis框架中SQL语句映射部分的编写

    1.resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: <mappers> <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/liming/mana

  • 详解Java的Hibernate框架中的缓存与二级缓存

    缓存 今天我们就来讲一下hibernate中实体状态和hibernate缓存.  1)首先我们先来看一下实体状态:  实体状态主要分三种:transient,persitent,detached.  看英文应该就大概明白了吧.  transient:是指数据还没跟数据库中的数据相对应.  persistent:是指数据跟数据库中的数据相对应,它的任何改变都会反映到数据库中.  detached:是指数据跟数据库中的数据相对应,但由于session被关闭,它所做的修改不会对数据库的记录造成影响.

  • 详解Java的Spring框架中bean的定义以及生命周期

    bean的定义 形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的<bean/>定义,已经看到了前几章的形式配置元数据创建. bean定义包含所需要的容器要知道以下称为配置元数据的信息: 如何创建一个bean Bean 生命周期的详细信息 Bean 依赖关系 上述所有配置元数据转换成一组的下列属性构成每个bean的定义. Spring配置元数据 Spring IoC

  • 详解Java的Spring框架中bean的注入集合

    使用value属性和使用<property>标签的ref属性在你的bean配置文件中的对象引用,这两种情况下可以处理单值到一个bean,如果你想通过多元值,如Java Collection类型List, Set, Map 及 Properties.要处理这种情况,Spring提供了四种类型的如下集合的配置元素: 可以使用<list> 或<set> 来连接任何实现java.util.Collection或数组. 会遇到两种情况(a)将收集的直接的值及(b)传递一个bean

随机推荐