zoukankan      html  css  js  c++  java
  • 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()方法



  • 相关阅读:
    快速排序及其优化
    JVM基础:深入学习JVM堆与JVM栈(转)
    java 反射简介(转载)
    java 泛型简介(转载)
    Java 注解简介
    JVM入门必看——JVM结构
    Java多线程详解(转载)
    SpringMVC 实现文件的上传与下载
    死锁简介
    SQL的模糊查询(转载)
  • 原文地址:https://www.cnblogs.com/loaderman/p/10037131.html
Copyright © 2011-2022 走看看