Hibernate一对多示例

来源:互联网 发布:淘宝开店装修 编辑:程序博客网 时间:2024/05/22 13:38

代码结构和使用的jar包

 

Employee.java(省略get set方法)

package com.orange.demo;/** * 员工实体 * 员工和部门的关系是多对一 */public class Employee {private Integer employeeId;private String employeeName;private Department department;}


Department(省略get set方法)

package com.orange.demo;import java.util.HashSet;import java.util.Set;/** * 部门实体 * 部门和员工的关系是一对多  */public class Department {private Integer departmentId;private String departmentName;private Set<Employee> employee = new HashSet<Employee>();}


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="com.orange.demo"><class name="Department" table="t_department"><id name="departmentId" column="departmentId"><generator class="native"></generator></id><property name="departmentName" column="departmentName" type="string"></property><!-- 部门和员工是一对多关系inverse属性:默认为false,表示本方维护关联关系。如果为true,表示本方不维护关联关系。 cascade=delete 删除部门时,同时将该部门的所有员工也删除,和inverse属性无关--><set name="employee" inverse="false" cascade="delete"> <!-- 指定需要关联的列 --><key column="departmentId"></key><!--需要关联的表(类) --><one-to-many class="Employee"/></set></class></hibernate-mapping>


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.orange.demo"><class name="Employee" table="t_employee"><id name="employeeId" column="employeeId"><generator class="native"></generator></id><property name="employeeName" column="employeeName" type="string"></property><!--相对于员工这一端是 多对一 --><many-to-one name="department" class="Department" column="departmentId"></many-to-one></class></hibernate-mapping>

Test.java

package com.orange.demo;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class Test {private static SessionFactory sessionFactory = null;static{Configuration cfg = new Configuration();cfg.configure("hibernate.cfg.xml");//在src目录下sessionFactory = cfg.buildSessionFactory();}public static void main(String[] args) {try {save();testGet();//delete();} catch (Exception e) {e.printStackTrace();}}public static void save() throws Exception {Session session = sessionFactory.openSession();Transaction tx =  session.beginTransaction();Department department1 = new Department();department1.setDepartmentName("开发部");Department department2 = new Department();department2.setDepartmentName("测试部");Employee employee1 = new Employee();employee1.setEmployeeName("大橙子");Employee employee2 = new Employee();employee2.setEmployeeName("二橙子");Employee employee3 = new Employee();employee3.setEmployeeName("小王");//为员工添加部门employee1.setDepartment(department1);employee2.setDepartment(department1);employee3.setDepartment(department2);/*//开发部增加两名员工,大橙子和二橙子department1.getEmployee().add(employee1);department1.getEmployee().add(employee2);//测试部增加一名员工,小王department2.getEmployee().add(employee3);*/session.save(department1);//需要被依赖的放在前面保存这里是员工需要依赖部门session.save(department2);session.save(employee1);session.save(employee2);session.save(employee3);tx.commit();session.close();}public static void testGet() throws Exception {Session session = sessionFactory.openSession();// 获取部门,并显示所有员工System.out.println("---------------------通过部门找员工-----------------------");Department department = (Department) session.get(Department.class, 1);System.out.println(department.getDepartmentName()+"有"+department.getEmployee().size()+"员工");System.out.println(department.getEmployee());//得到的是Employee的set集合,遍历可取出所有员工信息//获取员工,并显示所在部门System.out.println("---------------------通过员工找部门-----------------------");Employee employees = (Employee) session.get(Employee.class, 1);System.out.println(employees.getEmployeeName()+"在"+employees.getDepartment().getDepartmentName());session.close();}public static void delete() throws Exception{Session session = sessionFactory.openSession();Transaction tx =  session.beginTransaction();// 删除部门 inverse="true" 如果该部门有员工不能删除,没有才能删除//inverse="false" 可以删除 ,删除部门后会将员工所属部门设为nullDepartment department = (Department) session.get(Department.class, 15);session.delete(department);tx.commit();session.close();}}

员工和关系选择一种方法即可,结果都是一样的

employee1.setDepartment(department1);
employee2.setDepartment(department1);
employee3.setDepartment(department2);

或者:

department1.getEmployee().add(employee1);
department1.getEmployee().add(employee2);
department2.getEmployee().add(employee3);
删除部门时,这个部门可能会有员工,当inverse=true时,部门不能被删除,只有先将这个部门的员工删除后才能被删除,或者将依赖关系设置成null。

如果设置inverse=false,部门可以被删除 ,删除部门后会将该部门员工部门id设置成null

如果 Department.hbm.xml 中设置cascade="delete" (级联删除)那么删除部门时会将该部门的所有员工删除

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://localhost:3306/t1?characterEncoding=UTF-8</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.username">root</property><property name="hibernate.connection.password">123456</property><!-- 在控制台打印SQL,但不能打印建表语句 --><property name="hibernate.show_sql">true</property><!-- 打印SQL是否格式化 false:不格式化 --><property name="hibernate.format_sql">false</property><!--自动更新数据库结构 --><property name="hbm2ddl.auto">update</property><mapping resource="com/orange/demo/Department.hbm.xml"/><mapping resource="com/orange/demo/Employee.hbm.xml"/></session-factory></hibernate-configuration>


 

 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汽车没电了打不着火怎么办 吃凉的甜的牙疼怎么办 学车对点对不上怎么办 发现老公有外遇最明智的怎么办 想开个童装店但是没经验怎么办 母乳不够吃宝宝又不喝奶粉怎么办 掉头发很厉害怎么办有什么偏方 红米2a刷死机了怎么办 公司退市我们买的股票怎么办 黑魂3把npc杀了怎么办 摔倒了膝盖摔肿了又痛怎么办 厕所堵了怎么办疏通马桶有妙招 月经不来怎么办如何让它快点来 苹果手机进水了开不了机怎么办 苹果5s进水了怎么办修要多少钱 吃了过期3年的药怎么办 离婚后孩子的抚养费不给怎么办 小车钥匙丢了怎么办配要多少钱 一键启动的车钥匙丢了怎么办 股票退市了手里的股票怎么办 3d硬金以后要换怎么办 偏指甲红肿长在了肉里怎么办 牙齿黄怎么办教你牙齿美白小窍门 2岁孩门牙磕断了怎么办 脸上用了含激素的产品应该怎么办 身上起红疙瘩水泡很痒怎么办 怀疑老公有外遇他不承认怎么办 苹果手机锁屏密码忘了怎么办 黑色t恤洗了掉毛怎么办 老婆要和我离婚我该怎么办 发现老婆有外遇最明智的怎么办 高度近视怎么办我快一千度近 天刀耐久度为0了怎么办 新车被4s店装了怎么办 h面和w面联系线怎么办 造梦西游3到80级怎么办 加95的车加了92怎么办 95的车加92的油怎么办 宝宝六个月了奶水变少了怎么办 六个月的宝宝不爱吃奶粉怎么办 脸上挤黑头留下的小坑怎么办