• 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任务。

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    mysql5.7一颗B+树可以存放多少行数据?为什么使用B+树而不是B树?
    mysql5.7的锁:乐观锁/共享锁、互斥/排他锁、意向锁、记录锁、行锁/表锁、间隙锁、临界锁、插入意向锁、自增锁、空间索引预测锁、隐式锁
    mysql5.7事务的原理和MVCC,redo log与bin log的区别
    mysql5.7 Buffer Pool特性介绍。innodb三大特性:双写缓冲区、Buffer Pool、AHI(自适应HASH索引)
    mysql5.7 innodb数据字典
    mysql5.7系统表空间和独立表空间,断,组,区,页的概念,innodb双写缓冲区
    mysql5.7行数据存储格式
    mysql5.7全局考虑性能化,SQL优化的最后一步:profile性能分析
    mysql5.7innodb引擎底层分析:子查询种类回顾
    mysql5.7强制指定驱动表与被驱动表straight_join
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4909010.html
Copyright © 2020-2023  润新知