Hibernate One-to-One Mappings 一对一关系映射
关键:一对一关系映射和多对一关系映射很像,只是unique 属性值为 true
例子:一个员工只能有一个地址。
Hibernate框架的使用步骤:
1、创建Hibernate的配置文件(hibernate.cfg.xml)
2、创建持久化类,即其实例需要保存到数据库中的类(Employee.java)
3、创建对象-关系映射文件(Employee.hbm.xml)
4、通过Hibernate API编写访问数据库的代码
一、创建Hibernate的配置文件(hibernate.cfg.xml)
<?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/testOne2One</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.java)
package com.jiangge.hblearn; /** * @author jiangge * @version 2014-7-4 下午12:51:30 */ public class Employee { private int id; private String firstName; private String lastName; private int salary; private Address address; public Employee() { } public Employee(String fname, String lname, int salary, Address address) { this.firstName = fname; this.lastName = lname; this.salary = salary; this.address = address; } 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 Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
Address.java 文件:
package com.jiangge.hblearn; /** * @author jiangge * @version 2014-7-4 下午12:51:50 * */ public class Address { private int id; private String street; private String city; private String state; private String zipcode; public Address() { } public Address(String street, String city, String state, String zipcode) { this.street = street; this.city = city; this.state = state; this.zipcode = zipcode; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } }
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, address INT NOT NULL, PRIMARY KEY (id) );
create table ADDRESS ( id INT NOT NULL auto_increment, street_name VARCHAR(40) default NULL, city_name VARCHAR(40) default NULL, state_name VARCHAR(40) default NULL, zipcode VARCHAR(10) default NULL, PRIMARY KEY (id) );
三、创建对象-关系映射文件(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"> <!-- A one-to-one association is similar to many-to-one association with a difference that the column will be set as unique. The <many-to-one> element is used to set the relationship between EMPLOYEE and ADDRESS entities. The name attribute is set to the defined variable in the parent class, in our case it is address. The column attribute is used to set the column name in the parent table EMPLOYEE which is set to unique so that only one Employee object can be associated with an address object --> <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> <property name="firstName" column="first_name" type="string" /> <property name="lastName" column="last_name" type="string" /> <property name="salary" column="salary" type="int" /> <many-to-one name="address" column="address" unique="true" class="com.jiangge.hblearn.Address" not-null="true" /> </class> <class name="com.jiangge.hblearn.Address" table="ADDRESS"> <meta attribute="class-description"> This class contains the address detail. </meta> <id name="id" type="int" column="id"> <generator class="native" /> </id> <property name="street" column="street_name" type="string" /> <property name="city" column="city_name" type="string" /> <property name="state" column="state_name" type="string" /> <property name="zipcode" column="zipcode" type="string" /> </class> </hibernate-mapping>
四、通过Hibernate API编写访问数据库的代码:
一对一关系的测试类,CURD操作
package test; /** * @author jiangge * @version 2014-7-4 下午12:57:56 */ import java.util.Iterator; import java.util.List; 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.Address; import com.jiangge.hblearn.Employee; /** * 一对一关系测试类: * CRUD操作 * @author jiangge * */ 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 one address object */ Address address1 = ME.addAddress("Kondapur", "Hyderabad", "AP", "532"); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address1); /* Let us have another address object */ Address address2 = ME.addAddress("Saharanpur", "Ambehta", "UP", "111"); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* List down all the employees */ ME.listEmployees(); } /* Method to add an address record in the database */ public Address addAddress(String street, String city, String state, String zipcode) { Session session = factory.openSession(); Transaction tx = null; Integer addressID = null; Address address = null; try { tx = session.beginTransaction(); address = new Address(street, city, state, zipcode); addressID = (Integer) session.save(address); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return address; } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Address address) { Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try { tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary, address); 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 iterator = employees.iterator(); iterator.hasNext();) { Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Address add = employee.getAddress(); System.out.println("Address "); System.out.println("\tStreet: " + add.getStreet()); System.out.println("\tCity: " + add.getCity()); System.out.println("\tState: " + add.getState()); System.out.println("\tZipcode: " + add.getZipcode()); } 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(); } } }
五、运行结果:
数据库中
参考文献:
英文 http://www.tutorialspoint.com/hibernate/hibernate_one_to_one_mapping.htm