SessionFactoryTools类与上例相同。
1) /**
* 部门类
* @author A_shun
*
*/
public class Department {
private Integer id;
private String name;
//实例化一个集合员工类
private Set<Employee> employees = new HashSet<Employee>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
//重写同String函数
public String toString() {
return "Department [id=" + id + ", name=" + name + "]";
}
}
2) /**
* 员工类
* @author A_shun
*
*/
public class Employee {
private Integer id;
private String name;
private Department department;//声明一个部门的队象
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
//重新同toString函数
public String toString() {
return "Employee [id=" + id + ", name=" + name + "]";
}
}
3) /**
* 员工类和部门类的持久层类
*
* @author A_shun
*
*/
public class EmpAndDepDao {
/**
* save的方法
*/
@Test
public void save() {
Session session = SessionFactoryTools.getSession();// 获取一个session
Transaction tx = null;// 声明一个事务
try {
tx = session.beginTransaction();// 开始一个事务
// ============================================
// 新建部门对象,设置并设置部门名称
Department department = new Department();
department.setName("开发部");
// 新建两个员工对象,并设置姓名
Employee employee1 = new Employee();
employee1.setName("赵");
Employee employee2 = new Employee();
employee2.setName("钱");
// 将部门添加到员工类的中
employee1.setDepartment(department);
employee2.setDepartment(department);
// 将员工对象添加到部门类中
department.getEmployees().add(employee1);
department.getEmployees().add(employee2);
// 保存对象
session.save(employee1);
session.save(employee2);
session.save(department);
// ===============================================
tx.commit();
} catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}
}
/**
* getById
*/
@Test
public void getById() {
Session session = SessionFactoryTools.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// ==================================================
// 获取部门信息
<span style="white-space:pre"> </span> Department department = (Department)session.get(Department.class,1);
// 显示部门完整的信息
System.out.print(department + ": ");
System.out.println(department.getEmployees());
// 获取员工的信息
Employee employee = (Employee) session.get(Employee.class, 1);
// 显示员工的完整信息
System.out.print(employee + ": ");
System.out.println(employee.getDepartment());
// ==================================================
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
session.close();
}
}
/**
* 解除关联关系
*
* @throws Exception
*/
@Test
public void testRemoveRelation() throws Exception {
Session session = SessionFactoryTools.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// =============================================
// 从员工方解除
<span style="white-space:pre"> </span>Employee employee = (Employee) session.get(Employee.class, 10);
employee.setDepartment(null);
// 从部门方解除(与inverse有关系,为false时可以解除)
<span style="white-space:pre"> </span>Department department = (Department)session.get(Department.class, 5);
department.getEmployees().clear();
// =================================================
tx.commit();
} catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}
}
/**
* 删除对象,对关联对象的影响
*
* @throws Exception
*/
@Test
public void testDelete() throws Exception {
Session session = SessionFactoryTools.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// ==================================================
// 删除员工方(多方),对对方没有影响
<span style="white-space:pre"> </span>Employee employee = (Employee) session.get(Employee.class, 1);
session.delete(employee);
/**
* 删除部门方(一方) a, 如果没有关联的员工:能删除 b,
* 如果有关联的员工且inverse=true,由于不能维护关联关系,
<span style="white-space:pre"> </span> * 所以当直接执行删除时,就会有异常 ,
* 如果有关联的员工且inverse=false,由于可以维护关联关系,
<span style="white-space:pre"> </span> * 他就会先把关联的员工的外键列设为null值,再删除自己。
*/
<span style="white-space:pre"> </span>Department department=(Department)session.get(Department.class,1);
session.delete(department);
// =================================================
tx.commit();
} catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}
}
}
4)Department.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="map_1">
<!--类名:Department
类对应的表名:department
员工为集合类型 、员工的表名:employees
关联关系为:cascade全关联
维护关系为:本类不维护、有对方维护
外键名称:departmentId
映射的表名称为:Employee
-->
<class name="Department" table="department">
<id name="id" type="int" column="id">
<generator class="native" />
</id>
<property name="name" type="string" column="name" length="20" />
<set name="employees" cascade="all" inverse="true">
<key column="departmentId"></key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
5)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="map_1">
<!--类名:Employee
类对应的表名:employees
维护关系为:本类维护
对应列的名称:departmentId
映射的类名为:Department
映射的表名称为:department
-->
<class name="Employee" table="employees">
<id name="id" type="int" column="id">
<generator class="native" />
</id>
<property name="name" type="string" column="name" length="20" />
<many-to-one name="department" class="Department"
column="departmentId" ></many-to-one>
</class>
</hibernate-mapping>
6)Hibernate.cfg.xml文件的配置:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<!-- 配置数据库信息 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql:///hibernate0</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 其他配置 -->
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">false</property>
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件配置 -->
<mapping resource="map_1/Department.hbm.xml" />
<mapping resource="map_1/Employee.hbm.xml" />
</session-factory>
</hibernate-configuration>