当前位置: 首页 > news >正文

不用买服务器可以做网站吧台 东莞网站建设

不用买服务器可以做网站,吧台 东莞网站建设,中端网站建设公司,pc网站转换成app介绍 休眠获取策略确实可以使几乎没有爬网的应用程序和响应速度很快的应用程序有所不同。 在这篇文章中#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 #xff1a; 提取策略 描述 加入 原始SELECT语… 介绍 休眠获取策略确实可以使几乎没有爬网的应用程序和响应速度很快的应用程序有所不同。 在这篇文章中我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 提取策略 描述 加入 原始SELECT语句中的关联是OUTER JOINED 选择 附加的SELECT语句用于检索关联的实体实体 子选择 附加的SELECT语句用于检索整个关联的集合。 此模式适用于许多关联 批量 其他数量的SELECT语句用于检索整个关联的集合。 每个其他SELECT都会检索固定数量的关联实体。 此模式适用于许多关联 这些获取策略可能适用于以下情况 关联总是与其所有者一起初始化例如EAGER FetchType 导航未初始化的关联例如LAZY FetchType因此必须使用辅助SELECT检索关联 Hibernate映射获取信息形成了全局获取计划 。 在查询时我们可以覆盖全局获取计划但仅适用于LAZY关联 。 为此我们可以使用访存HQL / JPQL / Criteria指令。 EAGER关联不能被覆盖因此将您的应用程序与全局获取计划绑定在一起。 Hibernate 3承认LAZY应该是默认的关联获取策略 默认情况下Hibernate3对集合使用延迟选择获取对单值关联使用延迟代理获取。 对于大多数应用程序中的大多数关联而言这些默认设置有意义。 在注意到与Hibernate 2默认渴望获取有关的许多性能问题后做出了此决定。 不幸的是JPA采取了另一种方法并决定对许多关联为LAZY而渴望获得一对一的关系。 关联类型 默认提取策略 OneTMany 懒 多多多 懒 多多 急于 OneToOne 急于 EAGER获取不一致 尽管将关联标记为EAGER将获取职责委托给Hibernate可能很方便但还是建议使用基于查询的获取计划。 始终会获取EAGER关联并且获取策略在所有查询技术之间均不一致。 接下来我将演示EAGER的获取对于所有Hibernate查询变量的行为。 我将重用我先前在获取策略文章中介绍的实体模型 产品实体具有以下关联 ManyToOne(fetch FetchType.EAGER) JoinColumn(name company_id, nullable false) private Company company;OneToOne(fetch FetchType.LAZY, cascade CascadeType.ALL, mappedBy product, optional false) private WarehouseProductInfo warehouseProductInfo;ManyToOne(fetch FetchType.LAZY) JoinColumn(name importer_id) private Importer importer;OneToMany(fetch FetchType.LAZY, cascade CascadeType.ALL, mappedBy product, orphanRemoval true) OrderBy(index) private SetImage images new LinkedHashSetImage(); 公司协会被标记为EAGER并且Hibernate将始终采用获取策略来对其及其所有者实体进行初始化。 持久性上下文加载 首先我们将使用Persistence Context API加载实体 Product product entityManager.find(Product.class, productId); 生成以下SQL SELECT语句 Query:{[ select product0_.id as id1_18_1_, product0_.code as code2_18_1_, product0_.company_id as company_6_18_1_, product0_.importer_id as importer7_18_1_, product0_.name as name3_18_1_, product0_.quantity as quantity4_18_1_, product0_.version as version5_18_1_, company1_.id as id1_6_0_, company1_.name as name2_6_0_ from Product product0_ inner join Company company1_ on product0_.company_idcompany1_.id where product0_.id?][1] 使用内部联接检索了EAGER公司关联。 对于M个这样的关联所有者实体表将被连接M次。 每个额外的连接会增加整体查询的复杂性和执行时间。 如果我们甚至在所有可能的业务场景中都没有使用所有这些关联那么我们就付出了额外的性能损失却一无所获。 使用JPQL和条件进行获取 Product product entityManager.createQuery(select p from Product p where p.id :productId, Product.class).setParameter(productId, productId).getSingleResult(); 或搭配 CriteriaBuilder cb entityManager.getCriteriaBuilder(); CriteriaQueryProduct cq cb.createQuery(Product.class); RootProduct productRoot cq.from(Product.class); cq.where(cb.equal(productRoot.get(id), productId)); Product product entityManager.createQuery(cq).getSingleResult(); 生成以下SQL SELECT语句 Query:{[ select product0_.id as id1_18_, product0_.code as code2_18_, product0_.company_id as company_6_18_, product0_.importer_id as importer7_18_, product0_.name as name3_18_, product0_.quantity as quantity4_18_, product0_.version as version5_18_ from Product product0_ where product0_.id?][1]} Query:{[ select company0_.id as id1_6_0_, company0_.name as name2_6_0_ from Company company0_ where company0_.id?][1]} JPQL和Criteria查询均默认选择获取因此将为每个EAGER关联发布辅助选择。 关联数越大单个SELECTS越多对我们应用程序性能的影响就越大。 休眠标准API JPA 2.0添加了对Criteria查询的支持而Hibernate长期以来一直提供特定的动态查询实现 。 如果EntityManager实现委托方法调用旧版Session API则JPA Criteria实现是从头开始编写的。 这就是为什么Hibernate和JPA Criteria API在类似的查询方案中表现不同的原因。 前面的示例Hibernate Criteria等效项如下所示 Product product (Product) session.createCriteria(Product.class).add(Restrictions.eq(id, productId)).uniqueResult(); 关联的SQL SELECT是 Query:{[ select this_.id as id1_3_1_, this_.code as code2_3_1_, this_.company_id as company_6_3_1_, this_.importer_id as importer7_3_1_, this_.name as name3_3_1_, this_.quantity as quantity4_3_1_, this_.version as version5_3_1_, hibernatea2_.id as id1_0_0_, hibernatea2_.name as name2_0_0_ from Product this_ inner join Company hibernatea2_ on this_.company_idhibernatea2_.id where this_.id?][1]} 此查询使用连接抓取策略而不是选择抓取通过JPQL / HQL和标准的API使用。 休眠条件和多个EAGER集合 让我们看看将图像收集获取策略设置为EAGER时会发生什么 OneToMany(fetch FetchType.EAGER, cascade CascadeType.ALL, mappedBy product, orphanRemoval true) OrderBy(index) private SetImage images new LinkedHashSetImage(); 将生成以下SQL Query:{[ select this_.id as id1_3_2_, this_.code as code2_3_2_, this_.company_id as company_6_3_2_, this_.importer_id as importer7_3_2_, this_.name as name3_3_2_, this_.quantity as quantity4_3_2_, this_.version as version5_3_2_, hibernatea2_.id as id1_0_0_, hibernatea2_.name as name2_0_0_, images3_.product_id as product_4_3_4_, images3_.id as id1_1_4_, images3_.id as id1_1_1_, images3_.index as index2_1_1_, images3_.name as name3_1_1_, images3_.product_id as product_4_1_1_ from Product this_ inner join Company hibernatea2_ on this_.company_idhibernatea2_.id left outer join Image images3_ on this_.idimages3_.product_id where this_.id? order by images3_.index][1]} 休眠条件不会自动将父实体列表分组。 由于存在一对多子表JOIN因此对于每个子实体我们将获得一个新的父实体对象引用在我们当前的持久性上下文中它们均指向同一对象 product.setName(TV); product.setCompany(company);Image frontImage new Image(); frontImage.setName(front image); frontImage.setIndex(0);Image sideImage new Image(); sideImage.setName(side image); sideImage.setIndex(1);product.addImage(frontImage); product.addImage(sideImage);List products session.createCriteria(Product.class).add(Restrictions.eq(id, productId)).list(); assertEquals(2, products.size()); assertSame(products.get(0), products.get(1)); 因为我们有两个图像实体所以我们将获得两个Product实体引用它们均指向同一一级缓存条目。 要解决此问题我们需要指示休眠标准使用不同的根实体 List products session.createCriteria(Product.class).add(Restrictions.eq(id, productId)).setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY).list(); assertEquals(1, products.size());结论 EAGER的获取策略是一种代码味道。 大多数情况下它是出于简化的目的而使用而不考虑长期的性能损失。 提取策略绝不应成为实体映射的责任。 每个业务用例都有不同的实体负载要求因此应将获取策略委托给每个单独的查询。 全局提取计划应仅定义LAZY关联这些关联是在每个查询的基础上提取的。 与始终检查生成的查询策略结合使用基于查询的获取计划可以提高应用程序性能并降低维护成本。 Hibernate和JPA可用的代码。 翻译自: https://www.javacodegeeks.com/2014/12/eager-fetching-is-a-code-smell.html
http://www.huolong8.cn/news/78926/

相关文章:

  • 打造对外宣传工作平台网站建设百度一下首页设为主页
  • wordpress在线支付株洲网站优化找哪家
  • 网站关键词不稳定谷歌seo是做什么的
  • 个人网站的建设流程网站开发研究热点
  • 建网站和建网店的区别做网站需要哪些人手
  • 忘记网站后台用户名wordpress列表显示文章
  • 大学生兼职网站策划书flash网站建设教程视频
  • 网站建设方案报价单wordpress正文底部版权信息
  • 网站 数据库龙岩市城乡建设局网站进不去
  • 公司做网站如何跟客户介绍什么网站能让小孩做算术题
  • 怎么让百度多收录网站沈阳做网站的公司有哪些
  • 制作大型网站电商网站多少钱
  • 对网站分析哈尔滨建站模板大全
  • 网站使用引导wordpress贴心插件
  • 思科中国网站开发案例php团购网站的难点
  • 济南集团网站建设报价scrm服务商
  • it培训网站重庆平台网站建设设计
  • 网站结构怎么做遂宁移动网站建设
  • 网站建设售后质量保证怎么给公司做推广
  • 往建设厅网站上传东西做公司网站排名
  • 池州网站开发怀柔 做网站的
  • 承德 网站维护廊坊app网站制作
  • 西安商城网站开发qq是哪个开发运营公司的
  • 做网站要什么步骤外包服务是什么
  • 门户网站 方案亚马逊跨境电商个人开店
  • 网站dw建设php网站开发事例
  • 做巧克力的网站大气蓝色wap网站模板
  • 东莞搜索引擎网站推广广告公司名称推荐
  • 教师在哪些网站可以做兼职ios移动网站开发工具
  • 网站开发用什么编程语言哈尔滨房产信息网官方网站