一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java的Hibernate框架中的set映射集與SortedSet映射

詳解Java的Hibernate框架中的set映射集與SortedSet映射

2020-03-11 13:59goldensun JAVA教程

這篇文章主要介紹了詳解Java的Hibernate框架中的set映射集與SortedSet映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

Set
集合Set是一個(gè)java集合不包含任何重復(fù)的元素。更正式地說,Set不包含任何元素對(duì)e1和e2,使得e1.equals(e2),和至多一個(gè)空元素。所以被添加到一組對(duì)象必須實(shí)現(xiàn)equals()和hashCode()方法,使Java可以判斷任何兩個(gè)元素/對(duì)象是否是相同的。

集被映射到與映射表中<set>元素,并在java.util.HashSet中初始化。可以使用Set集合在類時(shí),有一個(gè)集合中不需要重復(fù)的元素。

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

?
1
2
3
4
5
6
7
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è)每個(gè)員工都可以有一個(gè)或多個(gè)與他/她相關(guān)的證書。因此,我們將存儲(chǔ)證書的相關(guān)信息在一個(gè)單獨(dú)的表,該表具有以下結(jié)構(gòu):

?
1
2
3
4
5
6
create table CERTIFICATE (
 id INT NOT NULL auto_increment,
 certificate_name VARCHAR(30) default NULL,
 employee_id INT default NULL,
 PRIMARY KEY (id)
);

將有一個(gè)對(duì)多EMPLOYEE和證書對(duì)象之間的關(guān)系:

定義POJO類:
讓我們實(shí)現(xiàn)我們的POJO類員工將被用于保存與EMPLOYEE表中的對(duì)象和有憑證的設(shè)置變量的集合。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.*;
 
public class Employee {
 private int id;
 private String firstName;
 private String lastName;
 private int salary;
 private Set 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 Set getCertificates() {
  return certificates;
 }
 public void setCertificates( Set certificates ) {
  this.certificates = certificates;
 }
}

現(xiàn)在讓我們定義另一個(gè)POJO類對(duì)應(yīng)的表的證書,這樣的證書對(duì)象可以存儲(chǔ)和檢索到的CERTIFICATE表。這個(gè)類還應(yīng)該同時(shí)實(shí)現(xiàn)了equals()和hashCode()方法,使Java可以判斷任意兩個(gè)元素/對(duì)象是否相同。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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;
 }
 public boolean equals(Object obj) {
  if (obj == null) return false;
  if (!this.getClass().equals(obj.getClass())) return false;
 
  Certificate obj2 = (Certificate)obj;
  if((this.id == obj2.getId()) && (this.name.equals(obj2.getName())))
  {
   return true;
  }
  return false;
 }
 public int hashCode() {
  int tmp = 0;
  tmp = ( id + name ).hashCode();
  return tmp;
 }
}

 

定義Hibernate映射文件:
讓我們開發(fā)指定Hibernate如何定義的類映射到數(shù)據(jù)庫表的映射文件。<SET>元素將被用來定義用于設(shè)置集合的規(guī)則。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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>
  <set name="certificates" cascade="all">
   <key column="employee_id"/>
   <one-to-many class="Certificate"/>
  </set>
  <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)熟悉了大部分的映射細(xì)節(jié),映射文件中的所有元素:

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

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

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

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

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

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

<SET>元素是新的,已被引入到設(shè)置CERTIFICATE 和Employee類之間的關(guān)系。我們使用cascade屬性中的<set>元素來告訴Hibernate來保存CERTIFICATE 對(duì)象,同時(shí)為Employee對(duì)象。name屬性被設(shè)置為在父類中的定義設(shè)置變量,在我們的情況下,它是CERTIFICATE 。對(duì)于每一組變量,我們需要定義在映射文件中單獨(dú)的一組元素。

<key>元素是包含外鍵的父對(duì)象,即在certificate表中的列。表EMPLOYEE。

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

創(chuàng)建應(yīng)用程序類:
最后,我們將創(chuàng)建應(yīng)用程序類的main()方法來運(yùn)行應(yīng)用程序。我們將使用這個(gè)應(yīng)用程序,以節(jié)省一些員工的記錄地連同憑證,然后我們將申請(qǐng)CRUD操作上的記錄。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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 */
  HashSet set1 = new HashSet();
  set1.add(new Certificate("MCA"));
  set1.add(new Certificate("MBA"));
  set1.add(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 */
  HashSet set2 = new HashSet();
  set2.add(new Certificate("BCA"));
  set2.add(new Certificate("BA"));
 
  /* 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, Set 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());
   Set certificates = employee.getCertificates();
   for (Iterator iterator2 =
       certificates.iterator(); iterator2.hasNext();){
     Certificate certName = (Certificate) iterator2.next();
     System.out.println("Certificate: " + certName.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ùn)行上述應(yīng)用程序。請(qǐng)確保已在進(jìn)行的編譯和執(zhí)行之前,適當(dāng)?shù)卦O(shè)置PATH和CLASSPATH。

  • 創(chuàng)建hibernate.cfg.xml配置文件中配置章節(jié)解釋。
  • 創(chuàng)建Employee.hbm.xml映射文件,如上圖所示。
  • 創(chuàng)建Employee.java源文件,如上圖所示,并編譯它。
  • 創(chuàng)建Certificate.java源文件,如上圖所示,并編譯它。
  • 創(chuàng)建ManageEmployee.java源文件,如上圖所示,并編譯它。
  • 執(zhí)行ManageEmployee二進(jìn)制文件來運(yùn)行程序。

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

?
1
$java ManageEmployee

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
 
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MBA
Certificate: PMP
Certificate: MCA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MBA
Certificate: PMP
Certificate: MCA

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

?
1
mysql> select * from employee;
?
1
2
3
4
5
6
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Manoj  | Kumar  | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
?
1
mysql> select * from certificate;
?
1
2
3
4
5
6
7
8
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
| 1 | MBA    |   1 |
| 2 | PMP    |   1 |
| 3 | MCA    |   1 |
+----+------------------+-------------+
3 rows in set (0.00 sec)
?
1
mysql>

SortedSet
SortedSet是java集合,該集合不包含任何重復(fù)的元素和元素使用提供他們的自然順序,或由一個(gè)比較器進(jìn)行排序。

一個(gè)SortedSet映射,在映射表<set>元素和java.util.TreeSet中初始化。排序?qū)傩钥梢员辉O(shè)置為一個(gè)比較器或自然順序。如果使用自然順序,那么它的迭代器遍歷的集合元素升序排列。

我們依然使用上面示例中所定義的RDBMS表,將有一個(gè)對(duì)多EMPLOYEE和證書對(duì)象之間的關(guān)系,POJO類也是如上定義。

讓我們實(shí)現(xiàn)POJO類員工將被用于保存EMPLOYEE表中的對(duì)象和有證書的SortedSet變量的集合。

現(xiàn)在讓我們定義另一個(gè)POJO類對(duì)應(yīng)的表的證書,這樣的證書對(duì)象可以存儲(chǔ)和檢索到的證書表。這個(gè)類還應(yīng)該實(shí)現(xiàn)Comparable接口和compareTo方法將被用來設(shè)置sort="natural" 在映射文件(見下面的映射文件)的情況下,元素進(jìn)行排序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Certificate implements Comparable <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;
 }
 public int compareTo(Certificate that){
  final int BEFORE = -1;
  final int AFTER = 1;
 
  if (that == null) {
   return BEFORE;
  }
 
  Comparable thisCertificate = this.getName();
  Comparable thatCertificate = that.getName();
 
  if(thisCertificate == null) {
   return AFTER;
  } else if(thatCertificate == null) {
   return BEFORE;
  } else {
   return thisCertificate.compareTo(thatCertificate);
  }
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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>
  <set name="certificates" cascade="all" sort="MyClass">
   <key column="employee_id"/>
   <one-to-many class="Certificate"/>
  </set>
  <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。前面已經(jīng)熟悉了大部分的映射細(xì)節(jié),但讓我們看到了映射文件中的所有元素:

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

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

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

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

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

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

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

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

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

如果使用sort="natural"的設(shè)置,并不需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的類,因?yàn)樽C書類已經(jīng)實(shí)現(xiàn)了Comparable接口和hibernate會(huì)使用compareTo(在證書類定義為比較證書名稱)方法。但是,我們使用的是在我們的映射文件自定義的比較器類MyClass,所以必須創(chuàng)建這個(gè)類的基礎(chǔ)上實(shí)現(xiàn)排序算法。降序時(shí)使用這個(gè)類在這個(gè)類排序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Comparator;
 
public class MyClass implements Comparator<Certificate>{
 public int compare(Certificate o1, Certificate 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.getName();
  Comparable thatCertificate = o2.getName();
 
  if(thisCertificate == null) {
   return AFTER * 1;
  } else if(thatCertificate == null) {
   return BEFORE * -1;
  } else {
   return thisCertificate.compareTo(thatCertificate) * -1;
  }
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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 */
  TreeSet set1 = new TreeSet();
  set1.add(new Certificate("MCA"));
  set1.add(new Certificate("MBA"));
  set1.add(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 */
  TreeSet set2 = new TreeSet();
  set2.add(new Certificate("BCA"));
  set2.add(new Certificate("BA"));
 
  /* 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, SortedSet 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());
   SortedSet certificates = employee.getCertificates();
   for (Iterator iterator2 =
       certificates.iterator(); iterator2.hasNext();){
     Certificate certName = (Certificate) iterator2.next();
     System.out.println("Certificate: " + certName.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í)行后,會(huì)在屏幕上獲得以下結(jié)果,并同時(shí)記錄會(huì)在員工和證書表被創(chuàng)建。可以看到證書已排序順序相反。可以通過改變映射文件試試,只需設(shè)置sort="natural"和執(zhí)行程序,并比較結(jié)果。

?
1
$java ManageEmployee
?
1
2
3
4
5
6
7
8
9
10
11
12
13
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
 
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: PMP
Certificate: MCA
Certificate: MBA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: PMP
Certificate: MCA
Certificate: MBA

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

?
1
mysql> select * from employee;
?
1
2
3
4
5
6
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Manoj  | Kumar  | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
?
1
mysql> select * from certificate;
?
1
2
3
4
5
6
7
8
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
| 1 | MBA    |   1 |
| 2 | PMP    |   1 |
| 3 | MCA    |   1 |
+----+------------------+-------------+
3 rows in set (0.00 sec)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产探花在线观看 | 天堂日韩 | 亚洲男gay同性同志 亚洲免费在线看 | 苍井空色欲迷墙 | 欧美一级视频在线观看 | 亚洲激情视频在线 | 亚洲国产欧美在线看片 | acg火影忍者熟密姬纲手h | 国产高清视频免费最新在线 | 国产精品久久久久久岛国 | 狠狠的撞进去嗯啊h女强男视频 | 日本xxxx在线视频免费 | 极品美女a∨片在线看 | 小浪妇奶真大水多 | 国产成人一区二区三区在线视频 | 国产精品午夜国产小视频 | 四虎影视色费永久在线观看 | 日日精品 | 成人免费毛片一区二区三区 | 80日本xxxxxxxxx| 精久久| 欧洲第一区第二区第三区 | 搡60一70岁的老女人小说 | 免费观看韩剧网站在线观看 | 精品亚洲视频在线观看 | 日本无遮挡拍拍拍凤凰 | 白丝超短裙被输出娇喘不停小说 | 2022最新国产在线 | 欧美人做人爱a全程免费 | 久久精品一区 | 亚洲风情无码免费视频 | 国产探花在线观看 | 亚洲日本视频在线 | 调教肉文| 色琪琪久久草在线视频 | 日本一级不卡一二三区免费 | 极品在线 | 青青久久久国产线免观 | 99精品在线免费 | 国产精品99爱免费视频 | 精品久久久久久国产 |