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()方法