hibernate多对一关联映射
2011-11-21 09:50
316 查看
hibernate多对一关联映射
关联映射,就是将关联关系映射到数据库中,所谓的关联关系在对象模型中就是一个或多个引用
多对一关联映射原理:在多的一端加入一个外键,指向一的一端
在多的一端采用如下标签映射:
<many-to-onename="group" column="groupid"/>
掌握级联的含义?
*级联是对象之间的连锁操作,它只影响添加、删除和修改
下面就以员工和部门的关系来进行说明
Dept.java
package org.xiaolong.entity;
public class Dept {
private Integer deptno;
private String dname;
//省略getter和setter方法
}
Dept.hbm.xml
Employee.java
Employee.hbm.xml
IEmployeeDAO.java
BaseDAO.java
EmployeeDAOImpl.java
编写单元测试类EmployeeDAOTest.java
注意:在多对一关联映射中,采用级联删除操作是有问题的,如果删除员工,同时把员工所在部门删掉啦,而其他在此部门的员工怎么办。。。。。。
而在一对多种还是符合逻辑的!
关联映射,就是将关联关系映射到数据库中,所谓的关联关系在对象模型中就是一个或多个引用
多对一关联映射原理:在多的一端加入一个外键,指向一的一端
在多的一端采用如下标签映射:
<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> |
Employee.java
package org.xiaolong.entity; public class Employee { private Integer empno; private String ename; private Dept dept; //省略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="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> |
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); } |
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(); } } |
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) { } } |
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的关联映射(6)-双向N-N关联
- Hibernate读书笔记-----Hibernate的关联映射之N-N关联映射 .
- Hibernate学习手记(5)--关联映射
- hibernate---->一对多关联映射
- Hibernate 映射关系 ---Many2Many 双向关联
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
- hibernate 6 映射集合和实体关联 | hibernate 实战(第二版) 第6章映射集合和实体关联 | 笔记
- 【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射
- 【SSH进阶之路】Hibernate映射——一对多关联映射(七)
- Hibernate关系映射(一)一对一单向外键关联@OneToOne Annotation方式
- Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
- Hibernate学习23 -- 关联映射13 -- 动态模式映射
- 【SSH】Hibernate关联映射
- 系统学习hibernate之四:hibernate多对一关联映射
- (四)hibernate关联映射之——一对多映射
- hibernate一对一映射外键关联
- hibernate详解(六)---多对多关联映射
- Hibernate读书笔记-----Hibernate的关联映射之1-N关联映射
- Hibernate关联映射(单项多对一和一对多、双向一对多)
- Hibernate 关联映射 之 一对多单项关联 (二)聪明的懒加载