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
- Hibernate一对多示例
- hibernate一对多与多对多示例
- hibernate 一对多单向关联配置完整示例
- ibatis一对多示例
- Hibernate 一对多例
- hibernate一对多例子
- hibernate 一对多映射
- hibernate一对多
- hibernate一对多 更新
- Hibernate一对多映射
- Hibernate 一对多
- Hibernate 一对多映射
- Hibernate一对多(单向)
- Hibernate一对多(双向)
- hibernate一对多
- Hibernate 一对多映射
- hibernate 一对多映射
- hibernate一对多实例
- EndDialog 与 DestroyWindow 的区别
- NSLog
- iconv脚本
- Freemarker调用java静态方法(也可以调用常量,枚举)
- hibernate标签 property-ref 属性
- Hibernate一对多示例
- 【Storm总结-5】Twitter Storm: Transactional Topolgoy简介
- 第十一周 项目6:回文素数(2)
- 明白了为啥样式前面老是加 -webkit-、-moz-等
- python推数据及流处理扩展
- Highcharts js统计图插件
- Code Vs 1010 过河卒
- Linux下*.tar.gz文件解压缩命令
- 安卓训练-开始-支持不同的设备-支持不同的平台版本