hibernate多对一关联映射
来源:互联网 发布:python培训班 马哥 编辑:程序博客网 时间:2024/05/17 22:58
hibernate多对一关联映射
关联映射,就是将关联关系映射到数据库中,所谓的关联关系在对象模型中就是一个或多个引用
多对一关联映射原理:在多的一端加入一个外键,指向一的一端
在多的一端采用如下标签映射:
<many-to-onename="group" column="groupid"/>
掌握级联的含义?
*级联是对象之间的连锁操作,它只影响添加、删除和修改
下面就以员工和部门的关系来进行说明
Dept.java
package org.xiaolong.entity;
public class Dept {
private Integer deptno;
private String dname;
//省略getter和setter方法
}
<?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="org.xiaolong.entity">
<class name="Dept" table="dept" schema="svse">
<id name="deptno" type="int">
<generator class="native"></generator>
</id>
<property name="dname" length="50" type="string"></property>
</class>
</hibernate-mapping>
Dept.hbm.xmlEmployee.java
package org.xiaolong.entity;
public class Employee {
private Integer empno;
private String ename;
private Dept dept;
//省略getter和setter方法
}
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="org.xiaolong.entity">
<class name="Employee" table="employee" schema="ADMIN" select-before-update="true">
<id name="empno" type="int">
<generator class="native"></generator>
</id>
<property name="ename" length="50" type="string"></property>
<!-- 映射部门(员工与部门是多对一的关系) -->
<many-to-one name="dept" column="deptno" lazy="false"></many-to-one>
</class>
</hibernate-mapping>
IEmployeeDAO.java
package org.xiaolong.dao;
import java.util.List;
import org.xiaolong.entity.Dept;
import org.xiaolong.entity.Employee;
public interface IEmployeeDAO {
public void addDept(Dept dept);
public void addEmployee(Employee employee);
public void updateEmployee(Employee employee);
public void deleteEmployee(Integer empno);
public Employee getEmployeeById(Integer empno);
public List<Employee> getAllUserInfo();
public List<Employee> getUserInfo(String ename);
public Employee getUserInfoByName(String ename);
}
BaseDAO.java
package org.xiaolong.dao.impl;
import org.hibernate.Session;
import org.xiaolong.util.HibernateUtil;
public class BaseDAO {
public Session getSession(){
return HibernateUtil.getSession();
}
public void closeSession(){
HibernateUtil.closeSession();
}
}
EmployeeDAOImpl.java
package org.xiaolong.dao.impl;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.xiaolong.dao.IEmployeeDAO;
import org.xiaolong.entity.Dept;
import org.xiaolong.entity.Employee;
public class EmployeeDAOImpl extends BaseDAO implements IEmployeeDAO {
private Logger logger = Logger.getLogger(EmployeeDAOImpl.class);
@Override
public void addDept(Dept dept) {
logger.info("add dept start........");
Transaction tx = null;
try {
Session session = this.getSession();
tx = session.beginTransaction();
session.save(dept);
//提交事务
tx.commit();
logger.info("add dept success.......");
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
logger.info("add dept failure.......");
throw e;
} finally {
this.closeSession();
}
logger.info("add dept end........");
}
//添加员工
public void addEmployee(Employee employee) {
logger.info("add employee start........");
Transaction tx = null;
try {
Session session = this.getSession();
tx = session.beginTransaction();
session.save(employee);
//提交事务
tx.commit();
logger.info("add employee success.......");
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
logger.info("add employee failure.......");
throw e;
} finally {
this.closeSession();
}
logger.info("add employee end........");
}
public void deleteEmployee(Integer empno) {
}
public List<Employee> getAllUserInfo() {
return null;
}
public Employee getEmployeeById(Integer empno) {
logger.info("get employee by id start........");
Employee employee = null;
try {
Session session = this.getSession();
employee = (Employee)session.get(Employee.class, empno);
//employee = (Employee)session.load(Employee.class, empno);
} catch (HibernateException e) {
e.printStackTrace();
logger.info("get employee by id failure.......");
throw e;
} finally {
this.closeSession();
}
return employee;
}
public List<Employee> getUserInfo(String ename) {
return null;
}
public Employee getUserInfoByName(String ename) {
return null;
}
public void updateEmployee(Employee employee) {
}
}
编写单元测试类EmployeeDAOTest.java
public class EmployeeDAOTest {
private static IEmployeeDAO dao =null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
dao = new EmployeeDAOImpl();
}
@Test
public void addEmployee(){
Dept dept = new Dept();
dept.setDname("销售部");
Employee emp = new Employee();
emp.setEname("张三");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEname("张三");
emp2.setDept(dept);
//在清理缓存是发生错误TransientObjectException
//由于部门实体处理临时状态,没有被session管理,数据库中没有相应的记录
//而员工实体处于持久状态,在清理缓存的时候找不到Dept对象
//结论:Persistent状态的对象不能引用Transient状态的对象
dao.addEmployee(emp);
dao.addEmployee(emp2);
}
@Test
public void addEmployee1(){
Dept dept = new Dept();
dept.setDname("销售部");
dao.addDept(dept);
Employee emp = new Employee();
emp.setEname("张三");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEname("张三");
emp2.setDept(dept);
//可以正确保存
//因为Dept和Employee都是持久状态的对象
//Hibernate在清理缓存的时候能找到关联的对象
dao.addEmployee(emp);
dao.addEmployee(emp2);
}
@Test
public void addEmployee2(){
Dept dept = new Dept();
dept.setDname("策划部");
dao.addDept(dept);
Employee emp = new Employee();
emp.setEname("三毛");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEname("小龙");
emp2.setDept(dept);
//可以正确保存,因为此处使用了级联特性
//Hibernate会首先保存与Employee关联的对象Dept
dao.addEmployee(emp);
dao.addEmployee(emp2);
}
@Test
public void loadEmployee(){
Employee employee = dao.getEmployeeById(2);
System.out.println(employee.getEname());
System.out.println(employee.getDept().getDname());
}
}
注意:在多对一关联映射中,采用级联删除操作是有问题的,如果删除员工,同时把员工所在部门删掉啦,而其他在此部门的员工怎么办。。。。。。
而在一对多种还是符合逻辑的!
- Hibernate关联映射--多对一映射
- Hibernate关联关系映射(多对一关联映射)
- Hibernate多对一单向关联映射
- hibernate多对一关联映射
- hibernate多对一关联映射
- hibernate映射多对一关联
- hibernate:多对一单向关联映射
- hibernate多对一关联映射
- hibernate---->多对一关联映射
- Hibernate多对一映射单向关联
- hibernate 关联映射 多对一
- Hibernate多对一关联映射(单向)
- Hibernate多对一关联映射
- 【Hibernate】多对一关联映射
- 【Hibernate】多对一关联映射
- hibernate关联映射:多对一、一对一
- Hibernate 关联映射 之 多对多 关联(一)
- Hibernate 关联映射 之 多对多 关联(一)
- session.createSQLQuery字符串丢失(转成char丢失字符串)
- java File类
- 在zend studio 7.1里安装aptana,强强整合!
- MySQL:如何编写Audit Plugin审计插件
- 罗明大学生成功学研究
- hibernate多对一关联映射
- 外媒称15项最佳电子产品影响人类未来
- 优化SQL查询:如何写出高性能SQL语句1
- [ASP.NET]在虚拟目录中禁止web.config继承IIS根目录的web.config的配置
- Windows Phone 实用开发技巧(1):图片缓存
- Delphi编译指令说明
- 罗明大学生成功学研究(续)
- LogMiner学习笔记
- 如何修改进程的访问权限