hibernate映射关系

来源:互联网 发布:中国的网络是局域网 编辑:程序博客网 时间:2024/06/05 04:06


1.Employee


[java] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.b_one2Many;  
  2.   
  3. public class Employee {  
  4.     private int empId;  
  5.     private String empName;  
  6.     private double salary;  
  7.     //员工与部门(多对一)  
  8.     private Dept dept;  
  9.     public int getEmpId() {  
  10.         return empId;  
  11.     }  
  12.     public void setEmpId(int empId) {  
  13.         this.empId = empId;  
  14.     }  
  15.     public String getEmpName() {  
  16.         return empName;  
  17.     }  
  18.     public void setEmpName(String empName) {  
  19.         this.empName = empName;  
  20.     }  
  21.     public double getSalary() {  
  22.         return salary;  
  23.     }  
  24.     public void setSalary(double salary) {  
  25.         this.salary = salary;  
  26.     }  
  27.     public Dept getDept() {  
  28.         return dept;  
  29.     }  
  30.     public void setDept(Dept dept) {  
  31.         this.dept = dept;  
  32.     }  
  33.       
  34.       
  35.   
  36. }  


2.Dept


[java] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. package cn.itcast.b_one2Many;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. public class Dept {  
  7.     private int deptId;  
  8.     private String deptName;  
  9.     //部门对应的多个员工(一对多)  
  10.     private Set<Employee> emps=new HashSet<Employee>();  
  11.     public int getDeptId() {  
  12.         return deptId;  
  13.     }  
  14.     public void setDeptId(int deptId) {  
  15.         this.deptId = deptId;  
  16.     }  
  17.     public String getDeptName() {  
  18.         return deptName;  
  19.     }  
  20.     public void setDeptName(String deptName) {  
  21.         this.deptName = deptName;  
  22.     }  
  23.     public Set<Employee> getEmps() {  
  24.         return emps;  
  25.     }  
  26.     public void setEmps(Set<Employee> emps) {  
  27.         this.emps = emps;  
  28.     }  
  29.       
  30.       
  31.   
  32. }  

3.Employee.hbm.xml

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  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. <!--   
  7.   
  8.   This mapping demonstrates content-based discrimination for the  
  9.   table-per-hierarchy mapping strategy, using a formula  
  10.   discriminator.  
  11.   
  12. -->  
  13. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中  -->  
  14. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)   
  15.     auto-import 默认为true,在写HQL的时候自动导入包名  
  16.             如果指定为false,在写HQL的时候必须要写上类的全名-->  
  17. <hibernate-mapping package="cn.itcast.b_one2Many">  
  18.     <class name="Employee" table="t_employee">  
  19.          <id name="empId">  
  20.             <generator class="native"></generator>  
  21.          </id>  
  22.          <property name="empName" length="20"></property>  
  23.          <property name="salary" type="double"></property>  
  24.            
  25.          <!--多对一的映射    
  26.             Employee映射关键点:  
  27.             1.映射的部门属性:dept  
  28.             2.映射的部门对象:对应的外键字段:dept_id  
  29.             3.部门的类型-->  
  30.          <many-to-one name="dept" column="dept_Id" class="Dept"></many-to-one>  
  31.            
  32.           
  33.     </class>  
  34.       
  35.   
  36. </hibernate-mapping>  

4.Dept.hbm.xml

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  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. <!--   
  7.   
  8.   This mapping demonstrates content-based discrimination for the  
  9.   table-per-hierarchy mapping strategy, using a formula  
  10.   discriminator.  
  11.   
  12. -->  
  13. <!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中  -->  
  14. <!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)   
  15.     auto-import 默认为true,在写HQL的时候自动导入包名  
  16.             如果指定为false,在写HQL的时候必须要写上类的全名-->  
  17. <hibernate-mapping package="cn.itcast.b_one2Many">  
  18.     <class name="Dept" table="t_dept">  
  19.          <id name="deptId">  
  20.             <generator class="native"></generator>  
  21.          </id>  
  22.          <property name="deptName" length="20"></property>  
  23.          <!-- 一对多关联映射配置(通过部门管理到员工)   
  24.              Dept映射关键点:  
  25.                1.指定映射的集合属性:emps  
  26.                2.集合属性对应的集合表:t_employee  
  27.                3.集合表的外键字段:t_employee.dept_id  
  28.                4.集合元素的类型-->  
  29.          <set name="emps" table="t_employee">  
  30.             <key column="dept_Id"></key>  
  31.             <one-to-many class="Employee"></one-to-many>  
  32.            
  33.          </set>  
  34.           
  35.            
  36.     </class>  
  37.       
  38.   
  39. </hibernate-mapping>  

5.测试类


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

6.hibernate.cfg.xml


[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  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.   
  5. <hibernate-configuration>  
  6.     <!-- 通常,一个session-factory节点代表一个数据库 -->  
  7.     <session-factory>  
  8.         <!-- 1.数据库连接配置 -->  
  9.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  10.         <property name="hibernate.connection.url">jdbc:mysql:///hib-demo</property>  
  11.         <property name="hibernate.connection.username">root</property>  
  12.         <property name="hibernate.connection.password">123456</property>  
  13.         <!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql  -->  
  14.         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>  
  15.           
  16.         <!-- 2.其他相关配置 -->  
  17.            <!--2.1显示hibernate在运行的时候执行的sql语句  -->  
  18.         <property name="hibernate.show_sql">true</property>  
  19.            <!-- 2.2格式化sql   
  20.         <property name="hibernate.format_sql">true</property>-->  
  21.         <!--    2.3自动建表  -->  
  22.         <property name="hibernate.hbm2ddl.auto">update</property>  
  23.         <!-- 3.加载所有映射   
  24.         <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->  
  25.     </session-factory>  
  26. </hibernate-configuration>  

0 0