hibernate中的一对多与多对一的配置参考

1.Employee

  1. package cn.itcast.b_one2Many;
  2. public class Employee {
  3. private int empId;
  4. private String empName;
  5. private double salary;
  6. //员工与部门(多对一)
  7. private Dept dept;
  8. public int getEmpId() {
  9. return empId;
  10. }
  11. public void setEmpId(int empId) {
  12. this.empId = empId;
  13. }
  14. public String getEmpName() {
  15. return empName;
  16. }
  17. public void setEmpName(String empName) {
  18. this.empName = empName;
  19. }
  20. public double getSalary() {
  21. return salary;
  22. }
  23. public void setSalary(double salary) {
  24. this.salary = salary;
  25. }
  26. public Dept getDept() {
  27. return dept;
  28. }
  29. public void setDept(Dept dept) {
  30. this.dept = dept;
  31. }
  32. }


2.Dept

  1. package cn.itcast.b_one2Many;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. public class Dept {
  5. private int deptId;
  6. private String deptName;
  7. //部门对应的多个员工(一对多)
  8. private Set<Employee> emps= new HashSet<Employee>();
  9. public int getDeptId() {
  10. return deptId;
  11. }
  12. public void setDeptId(int deptId) {
  13. this.deptId = deptId;
  14. }
  15. public String getDeptName() {
  16. return deptName;
  17. }
  18. public void setDeptName(String deptName) {
  19. this.deptName = deptName;
  20. }
  21. public Set<Employee> getEmps() {
  22. return emps;
  23. }
  24. public void setEmps(Set<Employee> emps) {
  25. this.emps = emps;
  26. }
  27. }

3.Employee.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--
  6. This mapping demonstrates content-based discrimination for the
  7. table-per-hierarchy mapping strategy, using a formula
  8. discriminator.
  9. -->
  10. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
  11. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
  12. auto-import 默认为true,在写HQL的时候自动导入包名
  13. 如果指定为false,在写HQL的时候必须要写上类的全名-->
  14. <hibernate-mapping package="cn.itcast.b_one2Many">
  15. <class name="Employee" table="t_employee">
  16. <id name="empId">
  17. <generator class="native"> </generator>
  18. </id>
  19. <property name="empName" length="20"> </property>
  20. <property name="salary" type="double"> </property>
  21. <!--多对一的映射
  22. Employee映射关键点:
  23. 1.映射的部门属性:dept
  24. 2.映射的部门对象:对应的外键字段:dept_id
  25. 3.部门的类型-->
  26. <many-to-one name="dept" column="dept_Id" class="Dept"> </many-to-one>
  27. </class>
  28. </hibernate-mapping>

4.Dept.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--
  6. This mapping demonstrates content-based discrimination for the
  7. table-per-hierarchy mapping strategy, using a formula
  8. discriminator.
  9. -->
  10. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
  11. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
  12. auto-import 默认为true,在写HQL的时候自动导入包名
  13. 如果指定为false,在写HQL的时候必须要写上类的全名-->
  14. <hibernate-mapping package="cn.itcast.b_one2Many">
  15. <class name="Dept" table="t_dept">
  16. <id name="deptId">
  17. <generator class="native"> </generator>
  18. </id>
  19. <property name="deptName" length="20"> </property>
  20. <!-- 一对多关联映射配置(通过部门管理到员工)
  21. Dept映射关键点:
  22. 1.指定映射的集合属性:emps
  23. 2.集合属性对应的集合表:t_employee
  24. 3.集合表的外键字段:t_employee.dept_id
  25. 4.集合元素的类型-->
  26. <set name="emps" table="t_employee">
  27. <key column="dept_Id"> </key>
  28. <one-to-many class="Employee"> </one-to-many>
  29. </set>
  30. </class>
  31. </hibernate-mapping>

5.测试类


  1. package cn.itcast.b_one2Many;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.Transaction;
  4. import org.hibernate.cfg.Configuration;
  5. import org.hibernate.classic.Session;
  6. import org.junit.Test;
  7. public class App_save {
  8. private static SessionFactory sf;
  9. static{
  10. sf= new Configuration()
  11. .configure()
  12. .addClass(Dept.class)
  13. .addClass(Employee.class) //测试的时候使用
  14. .buildSessionFactory();
  15. }
  16. //保存,通过部门方保存数据(一对多操作保存数据)
  17. @Test
  18. public void Save() {
  19. Session session=sf.openSession();
  20. session.beginTransaction();
  21. //部门对象
  22. Dept dept= new Dept();
  23. dept.setDeptName( "应用开发部");
  24. //员工对象
  25. Employee emp_zs= new Employee();
  26. emp_zs.setEmpName( "张三");
  27. Employee emp_ls= new Employee();
  28. emp_ls.setEmpName( "李四");
  29. //处理关系
  30. dept.getEmps().add(emp_zs);
  31. dept.getEmps().add(emp_ls);
  32. //保存数据
  33. session.save(emp_zs);
  34. session.save(emp_ls);
  35. session.save(dept);
  36. session.getTransaction().commit();
  37. session.close();
  38. /* Hibernate: insert into t_employee (empName, salary, dept_Id) values (?, ?, ?)
  39. Hibernate: insert into t_employee (empName, salary, dept_Id) values (?, ?, ?)
  40. Hibernate: insert into t_dept (deptName) values (?)
  41. Hibernate: update t_employee set dept_Id=? where empId=? //维护员工部门引用的id
  42. Hibernate: update t_employee set dept_Id=? where empId=?
  43. */
  44. }
  45. //推荐:用多的一方来保存数据,减少数据库维护的次数
  46. //保存数据,通过员工方保存数据(多对一操作数据)
  47. @Test
  48. public void Save2() {
  49. Session session=sf.openSession();
  50. session.beginTransaction();
  51. //部门对象
  52. Dept dept= new Dept();
  53. dept.setDeptName( "人事部");
  54. //员工对象
  55. Employee emp_zs= new Employee();
  56. emp_zs.setEmpName( "张三");
  57. Employee emp_ls= new Employee();
  58. emp_ls.setEmpName( "李四");
  59. //处理关系
  60. emp_zs.setDept(dept);
  61. emp_ls.setDept(dept);
  62. //保存数据
  63. //先保存一的一方,再保存多的一方,这样关系会自动维护(配置映射一定要正确)
  64. session.save(dept); //保存部门下的所有员工
  65. session.save(emp_zs);
  66. session.save(emp_ls);
  67. session.getTransaction().commit();
  68. session.close();
  69. /* Hibernate: insert into t_dept (deptName) values (?)
  70. Hibernate: insert into t_employee (empName, salary, dept_Id) values (?, ?, ?)
  71. Hibernate: insert into t_employee (empName, salary, dept_Id) values (?, ?, ?)
  72. 少生成2条update的sql
  73. */
  74. }
  75. }

6.hibernate.cfg.xml


  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <!-- 通常,一个session-factory节点代表一个数据库 -->
  6. <session-factory>
  7. <!-- 1.数据库连接配置 -->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>
  9. <property name="hibernate.connection.url">jdbc:mysql:///hib-demo </property>
  10. <property name="hibernate.connection.username">root </property>
  11. <property name="hibernate.connection.password">123456 </property>
  12. <!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
  13. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect </property>
  14. <!-- 2.其他相关配置 -->
  15. <!--2.1显示hibernate在运行的时候执行的sql语句 -->
  16. <property name="hibernate.show_sql">true </property>
  17. <!-- 2.2格式化sql
  18. <property name="hibernate.format_sql">true</property>-->
  19. <!-- 2.3自动建表 -->
  20. <property name="hibernate.hbm2ddl.auto">update </property>
  21. <!-- 3.加载所有映射
  22. <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
  23. </session-factory>
  24. </hibernate-configuration>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值