对于一对多关联和多对多关联,应该优先考虑使用默认的延迟检索策略。在Customer类中,以下代码对orders集合属性采用延迟检索策略:

//采用默认的延迟检索策略@OneToMany(mappedBy="customer")private Set<Order> orders = new HashSet<Order>();

或者:

//显式设置延迟检索策略@OneToMany(mappedBy="customer",             fetch=FetchType.LAZY)private Set<Order> orders = new HashSet<Order>();

此时运行EntityManager的find(Customer.class,Long.valueOf(1))方法,仅仅立即加载Customer对象,执行以下select语句:

select * from CUSTOMERS where ID=1;

EntityManager的find()方法返回的Customer对象的orders属性引用一个没有被初始化的集合代理类实例,换句话说,此时orders集合中没有存放任何Order对象。

只有当orders集合代理类实例被初始化时,才会到数据库中检索所有与Customer关联的Order对象,执行以下select语句:

select * from ORDERS where CUSTOMER_ID=1;

那么,Customer对象的orders属性引用的集合代理类实例什么时候被初始化呢?主要包括以下两种情况:
(1)当应用程序第一次访问它,例如调用它的iterator()、size()、isEmpty()或contains()方法:

Set<order> orders=customer.getOrders();//导致orders集合代理类实例被初始化Iterator<Order> it=orders.iterator();

(2)通过org.hibernate.Hibernate类的initialize()静态方法初始化它:

Set<Order> orders=customer.getOrders();Hibernate.initialzie(orders); //导致orders集合代理类实例被初始化

©著作权归作者所有:来自51CTO博客作者孙卫琴的原创作品,如需转载,请注明出处,否则将追究法律责任

每一份赞赏源于懂得

赞赏

0人进行了赞赏支持

更多相关文章

  1. 孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集
  2. Java集合面试题(2021最新版)
  3. 对已存在集合shardCollection失败
  4. 异常 - 虚拟机初始化错误 - Error occurred during initializati
  5. TIMESTAMP with implicit DEFAULT value is deprecated
  6. NoSQL MongoDB
  7. 两集合比较判断
  8. mysql5.7安装
  9. 睡前聊一聊"spring bean 生命周期"

随机推荐

  1. Oracle vs. Google 訴訟最新發展,Sun CEO
  2. Android LayoutInflater原理分析,带你一步
  3. 【笔记】试玩 cocos2d-x-3.0beta on andr
  4. Android中的实体类的正确用法
  5. Android使用libjpeg实现图片压缩
  6. Android 进程和线程模型
  7. android之NFC基础技术分享
  8. [转]Android 应用程序基础(Application Fu
  9. android权限管理之PermissionsDispatcher
  10. Android的路接下来该怎么走?