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

时间:2021-05-19

List映射表
List列表是一个java集合存储在序列中的元素,并允许重复的元素。此接口的用户可以精确地控制,其中列表中的每个元素插入。用户可以通过他们的整数索引访问元素,并搜索列表中的元素。更正式地说,列表通常允许对元素e1和e2,使得e1.equals(e2),它们通常允许多个null元素,如果他们允许的null元素。

List列表被映射在该映射表中的<list>元素,并将java.util.ArrayList中初始化。

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

此外,假设每个员工都可以有一个或多个与他/她相关的证书。List集合映射需要在一个集合表的索引列。索引列定义集合中的元素的位置。因此,我们将存储证书的相关信息在一个单独的表,该表具有以下结构:

create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, idx INT 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 List 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 List getCertificates() { return certificates; } public void setCertificates( List 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如何定义的类映射到数据库表的映射文件。<list>元素将被用来定义使用List集合的规则。表的索引是整数类型总是和使用<list-index>元素定义映射。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://mit(); }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: 4000Certificate: MCACertificate: MBACertificate: PMPFirst Name: Dilip Last Name: Kumar Salary: 3000Certificate: BCACertificate: BAFirst Name: Manoj Last Name: Kumar Salary: 5000Certificate: MCACertificate: MBACertificate: PMP

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

mysql> select * from EMPLOYEE;+----+------------+-----------+--------+| id | first_name | last_name | salary |+----+------------+-----------+--------+| 53 | Manoj | Kumar | 5000 |+----+------------+-----------+--------+1 row in set (0.00 sec)mysql> select * from CERTIFICATE;+----+------------------+-------------+| id | certificate_name | employee_id |+----+------------------+-------------+| 11 | MCA | 53 || 12 | MBA | 53 || 13 | PMP | 53 |+----+------------------+-------------+3 rows in set (0.00 sec)

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章