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

手机网站菜单栏怎么做dedecms网站地图怎么做

手机网站菜单栏怎么做,dedecms网站地图怎么做,网站的meta标签优化,西安wordpress建站N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时#xff0c;会发生这种情况#xff0c;以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体#xff1a;每个客户的一组订单和一组地址。 OneToMany… N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时会发生这种情况以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体每个客户的一组订单和一组地址。 OneToMany(mappedBy customer, cascade CascadeType.ALL, fetch FetchType.LAZY) private SetOrderEntity orders;OneToMany(mappedBy customer, cascade CascadeType.ALL, fetch FetchType.LAZY) private SetAddressEntity addresses; 要加载所有客户我们可以发出以下JPQL语句然后加载每个客户的所有订单 ListCustomerEntity resultList entityManager.createQuery(SELECT c FROM CustomerEntity AS c, CustomerEntity.class).getResultList(); for(CustomerEntity customerEntity : resultList) {SetOrderEntity orders customerEntity.getOrders();for(OrderEntity orderEntity : orders) {...} } Hibernate 4.3.5随JBoss AS Wildfly 8.1.0CR2一起提供将从数据库中仅为两个客户生成以下一系列SQL语句 Hibernate: selectcustomeren0_.id as id1_1_,customeren0_.name as name2_1_,customeren0_.numberOfPurchases as numberOf3_1_ fromCustomerEntity customeren0_ Hibernate: selectorders0_.CUSTOMER_ID as CUSTOMER4_1_0_,orders0_.id as id1_2_0_,orders0_.id as id1_2_1_,orders0_.campaignId as campaign2_2_1_,orders0_.CUSTOMER_ID as CUSTOMER4_2_1_,orders0_.timestamp as timestam3_2_1_ fromOrderEntity orders0_ whereorders0_.CUSTOMER_ID? Hibernate: selectorders0_.CUSTOMER_ID as CUSTOMER4_1_0_,orders0_.id as id1_2_0_,orders0_.id as id1_2_1_,orders0_.campaignId as campaign2_2_1_,orders0_.CUSTOMER_ID as CUSTOMER4_2_1_,orders0_.timestamp as timestam3_2_1_ fromOrderEntity orders0_ whereorders0_.CUSTOMER_ID? 如我们所见第一个查询从表CustomerEntity中选择所有客户。 接下来的两个选择先提取然后在第一个查询中加载我们已加载的每个客户的订单。 当我们有100个客户而不是2个客户时我们将获得101个查询。 一个初始查询可加载所有客户然后针对100个客户中的每个客户另外查询一个订单。 这就是为什么将此问题称为N 1的原因。 解决此问题的常见习惯是强制ORM生成内部联接查询。 在JPQL中可以通过使用JOIN FETCH子句来完成如以下代码片段所示 entityManager.createQuery(SELECT c FROM CustomerEntity AS c JOIN FETCH c.orders AS o, CustomerEntity.class).getResultList(); 正如预期的那样ORM现在使用OrderEntity表生成一个内部联接因此只需要一个SQL语句即可加载所有数据 selectcustomeren0_.id as id1_0_0_,orders1_.id as id1_1_1_,customeren0_.name as name2_0_0_,orders1_.campaignId as campaign2_1_1_,orders1_.CUSTOMER_ID as CUSTOMER4_1_1_,orders1_.timestamp as timestam3_1_1_,orders1_.CUSTOMER_ID as CUSTOMER4_0_0__,orders1_.id as id1_1_0__ fromCustomerEntity customeren0_ inner joinOrderEntity orders1_on customeren0_.idorders1_.CUSTOMER_ID 在您知道必须为每个客户加载所有订单的情况下JOIN FETCH子句将SQL语句的数量从N 1减少到1。这当然具有缺点即您现在要转移一个订单的所有订单。客户一次又一次的客户数据由于查询中的其他客户列。 JPA规范引入了2.1版即所谓的NamedEntityGraphs。 此注释使您可以描述JPQL查询应加载的图形而不是JOIN FETCH子句可以加载的图形从而为N 1问题提供了另一种解决方案。 下面的示例演示了我们的客户实体的NamedEntityGraph该实体仅加载客户名称及其订单。 订单在子图中的orderGraph中有更详细的描述。 在这里我们看到我们只想加载订单的字段ID和CampaignId。 NamedEntityGraph(name CustomersWithOrderId,attributeNodes {NamedAttributeNode(value name),NamedAttributeNode(value orders, subgraph ordersGraph)},subgraphs {NamedSubgraph(name ordersGraph,attributeNodes {NamedAttributeNode(value id),NamedAttributeNode(value campaignId)})} ) 在通过EntityManager使用其名称加载了NamedEntityGraph后将其作为JPQL查询的提示 EntityGraph entityGraph entityManager.getEntityGraph(CustomersWithOrderId); entityManager.createQuery(SELECT c FROM CustomerEntity AS c, CustomerEntity.class).setHint(javax.persistence.fetchgraph, entityGraph).getResultList(); Hibernate从4.3.0.CR1版本开始支持NamedEntityGraph注释并为上面显示的JPQL查询创建以下SQL语句 Hibernate: selectcustomeren0_.id as id1_1_0_,orders1_.id as id1_2_1_,customeren0_.name as name2_1_0_,customeren0_.numberOfPurchases as numberOf3_1_0_,orders1_.campaignId as campaign2_2_1_,orders1_.CUSTOMER_ID as CUSTOMER4_2_1_,orders1_.timestamp as timestam3_2_1_,orders1_.CUSTOMER_ID as CUSTOMER4_1_0__,orders1_.id as id1_2_0__ fromCustomerEntity customeren0_ left outer joinOrderEntity orders1_ on customeren0_.idorders1_.CUSTOMER_ID 我们看到Hibernate不会发出N 1查询而是NamedEntityGraph注释强制Hibernate为每个左外部联接加载订单。 当然这与FETCH JOIN子句有微妙的区别在子句中Hibernate创建了一个内部联接。 与FETCH JOIN子句相反左外部联接还将加载不存在订单的客户在FETCH JOIN子句中我们仅加载至少具有一个订单的客户。 有趣的是Hibernate加载的负载比表CustomerEntity和OrderEntity的指定属性更多。 由于这与NamedEntityGraph的规范第3.7.4节相冲突因此我为此创建了一个JIRA问题 。 结论 我们已经看到在JPA 2.1中我们为N 1问题提供了两种解决方案我们可以使用FETCH JOIN子句来急切地获取OneToMany关系这将导致内部联接或者我们可以使用NamedEntityGraph功能我们指定通过左外部联接加载哪个OneToMany关系。 翻译自: https://www.javacodegeeks.com/2014/07/using-namedentitygraph-to-load-jpa-entities-more-selectively-in-n1-scenarios.html
http://mrfarshtey.net/news/58534/

相关文章:

  • 建设银行沈阳分行网站聊城网站推广动态
  • 合肥生态丽景网站建设WordPress如何做多语言版本
  • 怎么做网站前台台州电子商务网站建设
  • 如何拥有自己的网站域名网站设计公司苏州
  • 营销型网站核心要素有哪些手机app开发最好的工具
  • 网站建设的基础服务盐城快速建设网站找哪家
  • 南平建设集团有限公司网站seo排名优化教学
  • 网站模板怎么用法商丘网站优化公司
  • 全球做的比较好的网站有哪些二级域名做网址导航大全网站
  • 偃师建设局网站手机网站关键词优化软件
  • 做词频云图的网站万网注册域名做简单网站
  • 西安百度网站快速优化湖州民生建设有限公司网站
  • 如何建企业仢网站手机网站导航页
  • 网站后台修改内容看不见了莱芜在线论坛 莱芜话题
  • 辽宁网站制作域名设计与分析
  • 聊城网站建设lchckj网站建设一般需要多少钱
  • 做百度网站费用多少合适网站建设方案书制作流程
  • 网站开发语言为wapwordpress 修订版本号
  • 网盘怎么做电影网站关键词网站推广
  • wps怎么做网站建设一个网站的基本成本
  • 软件网站技术开发公司页面设计快捷键
  • 手机做任务网站有哪些内容美容评测网站建设分析报告
  • 初中电脑做网站的软件360免费wifi总是断断续续的掉线
  • 河南省住房和城乡建设厅网站确认书dedecms织梦搬家公司网站模板
  • 做百度竞价对网站空间有什么要求计算机专业主要学什么学科
  • 网站开发工作周记开源电商网站建设价格
  • 营销网站开发规划专业的移动客户端网站建设
  • wordpress crm插件广州seo网站优化培训
  • 网站怎么注册啊泰安网络营销网站建设
  • 网站模板建设报价单网站建设是干什么