Hibernate Many-to-Many Mappings



创建表:

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_name VARCHAR(30) default NULL,
   PRIMARY KEY (id)
);

中间表:

create table EMP_CERT (
   employee_id INT NOT NULL,
   certificate_id INT NOT NULL,
   PRIMARY KEY (employee_id,certificate_id)
);



POJO 类:

package com.jiangge.hblearn;

import java.util.*;

public class Employee
{
	private int id;
	private String firstName;
	private String lastName;
	private int salary;
	private <span style="color:#ff0000;">Set certificates</span>;

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


package com.jiangge.hblearn;

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

配置文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

		<!-- Assume testone is the database name -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost/testMany2Many</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.show_sql">true</property>
		
		<!-- List of XML mapping files -->
		<mapping resource="resource/Employee.hbm.xml" />

	</session-factory>
</hibernate-configuration>


映射文件(写到一个文件中了 Employee.hbm.xml):

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

<!-- 
多对多关系映射:
The <set> element sets the relationship between Certificate and Employee classes. 
We set cascade attribute to save-update to tell Hibernate to persist the Certificate objects for SAVE 
i.e. CREATE and UPDATE operations at the same time as the Employee objects. 
The name attribute is set to the defined Set variable in the parent class, 
in our case it is certificates. For each set variable, we need to define a separate set element in the mapping file. 
Here we used name attribute to set the intermediate table name to EMP_CERT.

The <key> element is the column in the EMP_CERT table that holds the foreign key to the parent object
 ie. table EMPLOYEE and links to the certification_id in the CERTIFICATE table.

The <many-to-many> element indicates that 
one Employee object relates to many Certificate objects and column attributes are used to link intermediate EMP_CERT.
 -->
<hibernate-mapping>
   <class name="com.jiangge.hblearn.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>
      <span style="color:#ff0000;"><set name="certificates" cascade="save-update" table="EMP_CERT">
         <key column="employee_id"/>
         <many-to-many column="certificate_id" class="com.jiangge.hblearn.Certificate"/>
      </set></span>
      <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="com.jiangge.hblearn.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>



测试:

package test;

import java.util.*;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.jiangge.hblearn.Certificate;
import com.jiangge.hblearn.Employee;

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 certificates = new HashSet();

		certificates.add(new Certificate("MCA"));
		certificates.add(new Certificate("MBA"));
		certificates.add(new Certificate("PMP"));

		/* Add employee records in the database */
		Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, certificates);

		/* Add another employee record in the database */
		Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, certificates);

		/* 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();
		}
	}
}



数据库结果:

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 22 | Manoj      | Kumar     |   5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)

mysql> select * from CERTIFICATE;
+----+------------------+
| id | certificate_name |
+----+------------------+
|  4 | MBA              |
|  5 | PMP              |
|  6 | MCA              |
+----+------------------+
3 rows in set (0.00 sec)

mysql> select * from EMP_CERT;
+-------------+----------------+
| employee_id | certificate_id |
+-------------+----------------+
|          22 |              4 |
|          22 |              5 |
|          22 |              6 |
+-------------+----------------+
3 rows in set (0.00 sec)

mysql>






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。