博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate的映射
阅读量:6800 次
发布时间:2019-06-26

本文共 6837 字,大约阅读时间需要 22 分钟。

一、集合映射

1、 javabean设计

public class User {    private int userId;    private String userName;    // 一个用户,对应的多个地址    private Set
address; private List
addressList = new ArrayList
(); //private String[] addressArray; // 映射方式和list一样
private Map
addressMap = new HashMap
(); }

2、set使用重点掌握,还有就是对象的映射(后面有)

3、测试

// 保存set    @Test    public void testSaveSet() throws Exception {        Session session = sf.openSession();        session.beginTransaction();                //-- 保存        Set
addressSet = new HashSet
(); addressSet.add("广州"); addressSet.add("深圳"); // 用户对象 User user = new User(); user.setUserName("Jack"); user.setAddress(addressSet); // 保存 session.save(user); session.getTransaction().commit(); session.close(); } // 保存list/map @Test public void testSaveList() throws Exception { Session session = sf.openSession(); session.beginTransaction(); User user = new User(); user.setUserName("Tom");// // 用户对象 -- list// user.getAddressList().add("广州");// user.getAddressList().add("深圳");// // 保存// session.save(user); // 用户对象 -- Map user.getAddressMap().put("A0001", "广州"); user.getAddressMap().put("A0002", "深圳"); // 保存 session.save(user); session.getTransaction().commit(); session.close(); }

二、关联映射

  1、一对多与多对一映射(部门与员工表)

代码:

  1.1部门

public class Dept {    private int deptId;    private String deptName;    // 【一对多】 部门对应的多个员工    private Set
emps = new HashSet
();}

  1.2员工

public class Employee {    private int empId;    private String empName;    private double salary;    // 【多对一】员工与部门    private Dept dept;}

  1.3配置

  Dept.hbm.xml

当省略table="t_employee"时,Hibernate会根据<one-to-many class="Employee"/>的class="Employee"

Employee.hbm.xml找<class name="Employee"table="t_employee">

        -->

  Employee.hbm.xml

测试:

public class App {        private static SessionFactory sf;    static {        sf = new Configuration()            .configure()            .addClass(Dept.class)               .addClass(Employee.class)   // 测试时候使用            .buildSessionFactory();    }    // 保存, 部门方 【一的一方法操作】    @Test    public void save() {                Session session = sf.openSession();        session.beginTransaction();                // 部门对象        Dept dept = new Dept();        dept.setDeptName("应用开发部");        // 员工对象        Employee emp_zs = new Employee();        emp_zs.setEmpName("张三");        Employee emp_ls = new Employee();        emp_ls.setEmpName("李四");        // 关系        dept.getEmps().add(emp_zs);        dept.getEmps().add(emp_ls);        // 保存        session.save(emp_zs);        session.save(emp_ls);        session.save(dept); // 保存部门,部门下所有的员工                  session.getTransaction().commit();        session.close();        /*         *  结果         *  Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)            Hibernate: insert into t_dept (deptName) values (?)            Hibernate: update t_employee set deptId=? where empId=?    维护员工引用的部门的id            Hibernate: update t_employee set deptId=? where empId=?         */    }    // 【推荐】 保存, 部员方 【多的一方法操作】    @Test    public void save2() {                Session session = sf.openSession();        session.beginTransaction();                // 部门对象        Dept dept = new Dept();        dept.setDeptName("综合部");        // 员工对象        Employee emp_zs = new Employee();        emp_zs.setEmpName("张三");        Employee emp_ls = new Employee();        emp_ls.setEmpName("李四");        // 关系        emp_zs.setDept(dept);        emp_ls.setDept(dept);                        // 保存        session.save(dept); // 先保存一的方法        session.save(emp_zs);        session.save(emp_ls);// 再保存多的一方,关系回自动维护(映射配置完)                session.getTransaction().commit();        session.close();        /*         *  结果         *  Hibernate: insert into t_dept (deptName) values (?)            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)            Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)            少生成2条update  sql         */    }    }

总结:

  在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率

  配置一对多与多对一,    叫“双向关联”

  只配置一对多,              叫“单项一对多”

  只配置多对一,              叫“单项多对一”

注意:

         配置了哪一方,哪一方才有维护关联关系的权限!(配置了一对多,则可以用部门维护员工的关系,而不可用员工去维护部门)

   2、多对多映射

  需求:项目与开发人员

    电商系统

                      曹吉

                      王春

            OA系统

                      王春

                      老张

2.1项目

public class Project {    private int prj_id;    private String prj_name;    // 项目下的多个员工    private Set
developers = new HashSet
();}

配置:Project.hbm.xml

2.2开发人员

 

public class Developer {    private int d_id;    private String d_name;    // 开发人员,参数的多个项目    private Set
projects = new HashSet
();}

配置:Developer.hbm.xml

3、维护关联关系

设置inverse属性,在多对多种维护关联关系的影响?

1) 保存数据

有影响。

          inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;

         inverse=true,  没有控制权, 不会往中间表插入数据。

2) 获取数据

         无。

 

3) 解除关系

         // 有影响。

         // inverse=false ,有控制权, 解除关系就是删除中间表的数据。

         // inverse=true, 没有控制权,不能解除关系。

4) 删除数据

         有影响。

         // inverse=false, 有控制权。 先删除中间表数据,再删除自身。

         // inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除

转载于:https://www.cnblogs.com/h-g-f-s123/p/6383870.html

你可能感兴趣的文章
robots.txt的介绍和写作
查看>>
11个实用jQuery日历插件
查看>>
MySQL slave状态之Seconds_Behind_Master
查看>>
JS 怎么刷新当前页面
查看>>
jQuery笔记-插件开发小技巧
查看>>
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
查看>>
8天学通MongoDB——第八天 驱动实践
查看>>
国内外开源与 SaaS ,团队协作平台、项目管理工具整理
查看>>
oracle字符集查看修改
查看>>
[Leetcode] Container With Most Water
查看>>
查看版本信息的命令
查看>>
Linux搭建SVN服务器
查看>>
UML 之 数据流图(DFD)
查看>>
ReiserFS与EXT3的比较
查看>>
利用CSS3打造一组质感细腻丝滑的按钮
查看>>
hadoop中文官网
查看>>
phpQuery—基于jQuery的PHP实现(转)
查看>>
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类...
查看>>
codeforces 236A . Boy or Girl(串水问题)
查看>>
android消息推送
查看>>