• Hibernate3疑惑解决


    1.session的get()和load()有什么区别?
         # get()如果没有找到持久化类返回null,有可能导致空指针异常。
         # load()如果没有找到持久化类直接抛出异常。
         # get()是直接加载数据,load()是延迟加载,当使用被加载数据的时候才发送SQL。
    简而言之:Hibernate对于load()认为数据库一定存在,因此可以放心的使用代理进行延迟加
    载,如果使用中发现了问题,那么只能抛出异常。而对于get方法一定要获取真实的数据,否则
    返回null。

    DataType dataType1 = (DataType) session.load(DataType.class, new Long(1));
    DataType dataType2 = (DataType) session.load(DataType.class, new Long(1));
    System.out.println(dataType1);   // 延迟加载,需要使用才发送SQL语句
    System.out.println(dataType2);   // 从一级缓存中获取持久化对象
    System.out.println(dataType1 == dataType2);
    session.getTransaction().commit();

    2.Query对象在获取表的所有的数据的时候,使用list()和 iterator()有什么区别?
        # 编写代码的方式不同 list()和iterator()
         # 底层发送的SQL语句不同
            list()直接一次性获取到所有持久化类的对象
            iterator()先获取的是所有的数据的id值。当真正的遍历使用数据的
            时候再发送select语句。因此该方法一定要处于session会话中。
         # list发送的查询语句只有1条。Iterator发送多条查询语句,因此
            iterator的效率低下。懒汉式(iterator)   饿汉式(list)
    3.list和iterator什么时候使用?
                list()如果表中有少量条数据
                iterator()如果表中有N W条数据

    联合主键问题?
          (1) 联合主键映射后可以进行数据的插入
          (2) 联合主键添加后如何查找该持久化对象?
          (3) 联合主键类为什么要实现Serializable接口?
    问题解决
          (1) 继续使用get方式加载持久化的对象
               get(Class clazz, Serializable id)
          (2) 只有主键实现了Serializable接口才可以调用该get()方法



  • 相关阅读:
    在.net 4.0程序中使用TPL Dataflow
    打算把我的视频工具整合一下
    Visual Studio 2012 Updater 2 发布了
    Entity Framework学习(二)基本操作
    Entity Framework学习(一)CodeFirst入门
    VS2012中对C++注释高亮的改进
    【翻译】(12)NDK GDB
    (3)NDK Development
    【翻译】(10)Import Module
    【翻译】(7)CPU Arch ABIs
  • 原文地址:https://www.cnblogs.com/loaderman/p/10037131.html
Copyright © 2020-2023  润新知