hibernate学习——Set集合配置

Set集合的配置

数据表的创建:表关系一个员工拥有多个身份

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, employee_id INT default NULL, PRIMARY KEY (id) );

创建相应的实体:

package com.study01;

import java.util.Set;

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 firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	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.study01;

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;
		//}
		if(this.name.equals(obj2.getName())) return true;
		return false;
	}

	public int hashCode() {
		int tmp = 0;
		tmp = (id + name).hashCode();
		return tmp;
	}
}

注意这里对equals和hashCode方法进行了重写。set集合中元素不反复。是否反复,是通过hashCode和equals方法进行比較的。

hibernate主配置文件的配置例如以下:

<?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 test is the database name -->
		<property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property>
		<property name="hibernate.connection.username"> root </property>
		<property name="hibernate.connection.password"> 253503125 </property> <!-- List of XML mapping files -->
		<mapping resource="com/study01/Employee.hbm.xml" />
		<mapping resource="com/study01/Certificate.hbm.xml" />
	</session-factory>
</hibernate-configuration>

映射文件的配置:

<?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 package="com.study01">
	<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>

</hibernate-mapping>
<?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 package="com.study01">

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

測试:

package com.study01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
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();
		HashSet set1 = new HashSet();
		set1.add(new Certificate("MCA"));
		set1.add(new Certificate("MBA"));
		set1.add(new Certificate("PMP"));
		set1.add(new Certificate("MCA"));

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

		HashSet set2 = new HashSet();
		set2.add(new Certificate("BCA"));
		set2.add(new Certificate("BA"));
		Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);

		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 */
		System.out.println("======================");
		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();
		}
	}
}

注意在Certificate中加入?了两个MCA。执行结果例如以下:

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

MCA仅仅出现了一次!注意Certificate中hashCode和equals的作用。

时间: 2024-08-28 17:29:53

hibernate学习——Set集合配置的相关文章

Hibernate学习笔记(1)Hibernate配置

一 准备工作 首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序. 我们所做的第一件事就是创建我们的开发目录,并且把所有需要用到的Java库文件放进去.解压缩从Hibernate网站下载的Hibernate发布包,并把所有需要的库文件拷到我们项目中去. 学习建User-library-hibernate,并加入相应的jar包 (a)项目右键-buildpath-configure build path-add library (b)选择User-libr

hibernate set集合配置排序

在使用hibernate 的时候如果配置的一对多关系为set集合,那么如果直接取用的时候集合中的元素就会出现乱序 如果希望取出来的元素可以按照指定的字段排序我们可以在 set集合的节点中进行配置 根据subTypes这个集合所映射的表中的id字段的顺序存储. <set name="subTypes" inverse="true" order-by="id"> <key> <column name="pare

Hibernate学习---第八节:继承关系的映射配置

1.单表继承 (1).实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的) * 属性通常建议提供 getter/setter 方法 * 持久化类不能使用 final 修饰

Hibernate学习——一般配置

mysql建表语句: 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) ); Employee.java package com.study; public class Employee { private

Hibernate学习---第一节:hibernate配置和入门程序

一.ORM 简介: ORM 全称是 Object\ Relation Mapping, 即对象\关系映射 ORM 可以理解为一种规范,具体的 ORM 框架可作为应用程序和数据库的桥梁 面向对象程序设计语言与关系型数据库发展不同步时,需要一种中间解决方案,ORM 框架就是这样的解决方案 ORM 不是具体的产品,是一类框架的总称,基本特征: (1).完成面向对象的程序设计语言到关系数据库的映射 (2).基于 ORM 框架完成映射后,即可利用面向对象程序设计语言的简单易用性,又可利用关系型数据库的技术

Hibernate学习11——Hibernate 高级配置

第一节:配置数据库连接池 这里配置c3p0连接池,需要的jar包: jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p0 文档中介绍了两种配置方式: 1)在hibernate.properties中配置: 2)在hibernate.cfg.xml中配置: <hibernate-configuration> <session-factory> <!--数据库连接设置 --> <prop

hibernate 学习知识总结

1.最近用hibernate 学会很多知识,总结如下: (1)数据库表格已经设置默认值,在进行数据插入的时候,bean里面不赋值的话,插入之后该字段依旧是null 是因为hibernate默认插入和更新所有字段,如果某些字段不需要操作,需要配置下 (i)xml文件配置方式: <property name="account" type="java.lang.String" insert="false"> <column name=

[原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate学习汇总

一.Hibernate的基本原理 1.什么是Hibernate Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了.其实对于对象来说就是持久化. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的