Hibernate的关联映射包括:
一对一(Persion - IDCard)
一对多(Department - Employee)
多对一(Employee - Department)
多对多(Teacher - Student)
组件映射(User - Name)
集合映射(Set、List、Map)
inverse和cascade(Employee - Department)
本文以多对一为例:
多个员工对应一个部门(Employee - Department)
映射文件 <many-to-one name="depart" column="depart_id">
实体类:Department.java 和 Employee.java
package com.cos.entity;
/**
* 部门
* @author wangjy
*/
public class Department {
private int id;
private String 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;
}
}
package com.cos.entity;
/**
* 员工
* @author wangjy
*/
public class Employee {
private int id;
private String name;
private Department dept;
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 Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
映射文件:Department.hbm.xml 和 Employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cos.entity"> <class name="Department" lazy="true"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.cos.entity.Employee" lazy="true"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="dept"/> </class> </hibernate-mapping>
Hibernate配置文件:hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hi</property> <property name="hibernate.connection.username"></property> <property name="hibernate.connection.password"></property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">create</property> <property name="show_sql">true</property> <mapping resource="com/cos/entity/Employee.hbm.xml"/> <mapping resource="com/cos/entity/Department.hbm.xml"/> </session-factory> </hibernate-configuration>
工具类:HibernateUtil.java
package com.cos.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public final class HibernateUtil {
private static SessionFactory sesseionFactory;
static {
Configuration conf = new Configuration();
conf.configure();
sesseionFactory = conf.buildSessionFactory();
}
public static SessionFactory getSesseionFactory() {
return sesseionFactory;
}
}
测试类:
package com.cos.main;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.cos.entity.Department;
import com.cos.entity.Employee;
import com.cos.util.HibernateUtil;
public class Many2One {
public static void main(String[] args) {
add();
}
public static void add(){
SessionFactory sessionFactory = null;
Session s = null;
Transaction t = null;
try{
sessionFactory = HibernateUtil.getSesseionFactory();
s = sessionFactory.openSession();
t = s.beginTransaction();
Department dept = new Department();
dept.setName("dept name 2");
Employee emp = new Employee();
emp.setName("emp name 2");
emp.setDept(dept);
s.save(dept);
s.save(emp);
t.commit();
s.close();
sessionFactory.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
表结构:department表 和employee表
CREATE TABLE `department` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
CREATE TABLE `employee` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`dept` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `FK4AFD4ACE66A70F4E` (`dept`),
CONSTRAINT `FK4AFD4ACE66A70F4E` FOREIGN KEY (`dept`) REFERENCES `department` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
mysql> desc department;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
mysql> desc employee;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| dept | int(11) | YES | MUL | NULL | |
+-------+--------------+------+-----+---------+----------------+