lazy-loading 相关问题

延迟加载是计算机编程中常用的设计模式,用于将对象的初始化推迟到需要它的点。

无法弄清楚要导入哪些模块才能使服务与 Angular 中的 Firestore 配合使用

我做了一个非常基本的服务,如下所示: @Injectable({ 提供于:“root” }) 导出类 ItemService { 私人数据库!:CollectionReference; 构造...

回答 1 投票 0

强制创建Lazy<T>对象

我收到了一系列 Lazy 物品。然后我想一次性强行将它们全部“创建”。 无效测试(IEnumerable>项目){ } 通常是懒惰的

回答 4 投票 0

强制创建惰性对象

我收到了一系列懒惰物品。然后我想一次性强行将它们全部“创建”。 无效测试(IEnumerable>项目){ } 通常对于懒惰的物品,续...

回答 4 投票 0

延迟加载多个默认导出的组件

我有一个包含多个图标组件的组件库,我想将它们引入到我的新项目中,但我想延迟加载,但我不确定如何进行此操作。 图标组合...

回答 1 投票 0

JPA + EclipseLink - 使用封闭的 EntityManager 进行延迟加载

我在 Java SE 项目中使用 EclipseLink 作为 JPA 提供程序。我已经正确配置了编织以允许延迟加载。 与 Hibernate(抛出 LazyInitializationException)不同,EclipseLi...

回答 3 投票 0

C#:我应该对每个相关属性使用延迟加载吗?

我正在研究延迟加载。我不明白延迟加载是如何工作的,我应该做些什么来改变它吗? 这是我的第一个案例:我有用户、用户角色和角色类。用户有...

回答 1 投票 0

C# 我应该对每个相关属性使用延迟加载吗

我正在研究延迟加载。我无法理解延迟加载是如何工作的,我应该做些什么来改变它吗? 这是我的第一个案例: 我有用户、用户角色和角色类。用户有

回答 1 投票 0

如何在react中延迟加载音频组件

我有一个供学生使用的单词库应用程序,它可以播放编码如下的单词的音频: 从“@chakra-ui/button”导入{ IconButton }; 导入 { useEffect, useState }...

回答 1 投票 0

如果使用主键作为字符串,LazyLoading 不起作用

我有这三款 公共课 Resposta { [钥匙] 公共 int Id { 得到;放; } 公共字符串 PerguntaAlias { 获取;放; } 公共虚拟 Pergunta Pergunta { ...

回答 1 投票 0

LazyLoading 在使用 .net 的实体中不起作用

LazyLoading 不适用于我的实体 这是我的课 佩尔贡塔公开课 { [钥匙] 公共 int Id { 得到;放; } 公共字符串描述{获取;放; } 公共...

回答 2 投票 0

Hugo 中的延迟加载内容

我正在考虑使用 Hugo 构建一个静态网站。我正在考虑将帖子发布到登陆页面上,但我想知道如果添加太多帖子,登陆页面是否会变得太大。

回答 1 投票 0

在按钮单击上实现延迟加载程序在 asp.net mvc jquery 中不起作用

我在使用 asp.net mvc 框架的应用程序中实现了 Lazyloader 功能。下面是我为 Lazyloader 编写代码的代码。 $("#btnSubmitCT").on('点击', functi...

回答 1 投票 0

延迟图像加载问题

我有以下问题。我使用react-lazy-load-image-component 来延迟图像加载。页面上有几个选项卡。在第一个上,一切正常并且图像已加载......

回答 1 投票 0

如何在 TabView (PrimeNG) 中延迟加载 Angular 2 组件?

这是我的app.component.ts: 从 '@angular/core' 导入 { Component } ; @成分({ templateUrl: 'app/app.component.html', 选择器:“我的应用程序” }) 导出类 AppComponent { } 这是...

回答 6 投票 0

Hibernate:提取所有惰性集合的最佳实践

我有: @实体 公共类 MyEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(名称 = "myentiy_id") 私人名单 我有: @Entity public class MyEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Address> addreses; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Person> persons; //.... } public void handle() { Session session = createNewSession(); MyEntity entity = (MyEntity) session.get(MyEntity.class, entityId); proceed(session); // FLUSH, COMMIT, CLOSE session! Utils.objectToJson(entity); //TROUBLES, because it can't convert to json lazy collections } 什么问题: 问题是会话关闭后我无法拉动惰性集合。但我也无法不使用 proceed 方法关闭会话。 多么好的解决方案(粗略的解决方案): a) 在会话关闭之前,强制休眠拉取惰性集合 entity.getAddresses().size(); entity.getPersons().size(); .... b)也许更优雅的方法是使用 @Fetch(FetchMode.SUBSELECT) 注释 问题: 最佳实践/常见方法/更优雅的方法是什么?意味着将我的对象转换为 JSON。 在 Hibernate.initialize() 中使用 @Transactional 来初始化惰性对象。 start Transaction Hibernate.initialize(entity.getAddresses()); Hibernate.initialize(entity.getPersons()); end Transaction 现在在事务之外,您可以获取惰性对象。 entity.getAddresses().size(); entity.getPersons().size(); 您可以在同一事务中遍历 Hibernate 对象的 Getters,以确保使用以下 generic 帮助器类急切地获取所有惰性子对象: HibernateUtil.initializeObject(myObject, "my.app.model"); package my.app.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import org.aspectj.org.eclipse.jdt.core.dom.Modifier; import org.hibernate.Hibernate; public class HibernateUtil { public static byte[] hibernateCollectionPackage = "org.hibernate.collection".getBytes(); public static void initializeObject( Object o, String insidePackageName ) { Set<Object> seenObjects = new HashSet<Object>(); initializeObject( o, seenObjects, insidePackageName.getBytes() ); seenObjects = null; } private static void initializeObject( Object o, Set<Object> seenObjects, byte[] insidePackageName ) { seenObjects.add( o ); Method[] methods = o.getClass().getMethods(); for ( Method method : methods ) { String methodName = method.getName(); // check Getters exclusively if ( methodName.length() < 3 || !"get".equals( methodName.substring( 0, 3 ) ) ) continue; // Getters without parameters if ( method.getParameterTypes().length > 0 ) continue; int modifiers = method.getModifiers(); // Getters that are public if ( !Modifier.isPublic( modifiers ) ) continue; // but not static if ( Modifier.isStatic( modifiers ) ) continue; try { // Check result of the Getter Object r = method.invoke( o ); if ( r == null ) continue; // prevent cycles if ( seenObjects.contains( r ) ) continue; // ignore simple types, arrays und anonymous classes if ( !isIgnoredType( r.getClass() ) && !r.getClass().isPrimitive() && !r.getClass().isArray() && !r.getClass().isAnonymousClass() ) { // ignore classes out of the given package and out of the hibernate collection // package if ( !isClassInPackage( r.getClass(), insidePackageName ) && !isClassInPackage( r.getClass(), hibernateCollectionPackage ) ) { continue; } // initialize child object Hibernate.initialize( r ); // traverse over the child object initializeObject( r, seenObjects, insidePackageName ); } } catch ( InvocationTargetException e ) { e.printStackTrace(); return; } catch ( IllegalArgumentException e ) { e.printStackTrace(); return; } catch ( IllegalAccessException e ) { e.printStackTrace(); return; } } } private static final Set<Class<?>> IGNORED_TYPES = getIgnoredTypes(); private static boolean isIgnoredType( Class<?> clazz ) { return IGNORED_TYPES.contains( clazz ); } private static Set<Class<?>> getIgnoredTypes() { Set<Class<?>> ret = new HashSet<Class<?>>(); ret.add( Boolean.class ); ret.add( Character.class ); ret.add( Byte.class ); ret.add( Short.class ); ret.add( Integer.class ); ret.add( Long.class ); ret.add( Float.class ); ret.add( Double.class ); ret.add( Void.class ); ret.add( String.class ); ret.add( Class.class ); ret.add( Package.class ); return ret; } private static Boolean isClassInPackage( Class<?> clazz, byte[] insidePackageName ) { Package p = clazz.getPackage(); if ( p == null ) return null; byte[] packageName = p.getName().getBytes(); int lenP = packageName.length; int lenI = insidePackageName.length; if ( lenP < lenI ) return false; for ( int i = 0; i < lenI; i++ ) { if ( packageName[i] != insidePackageName[i] ) return false; } return true; } } 不是最好的解决方案,但这是我得到的: 1) 使用此注解注释要初始化的 getter: @Retention(RetentionPolicy.RUNTIME) public @interface Lazy { } 2)从数据库读取对象后,在对象上使用此方法(可以放在泛型类中,也可以用 Object 类更改 T): public <T> void forceLoadLazyCollections(T entity) { Session session = getSession().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.refresh(entity); if (entity == null) { throw new RuntimeException("Entity is null!"); } for (Method m : entityClass.getMethods()) { Lazy annotation = m.getAnnotation(Lazy.class); if (annotation != null) { m.setAccessible(true); logger.debug(" method.invoke(obj, arg1, arg2,...); {} field", m.getName()); try { Hibernate.initialize(m.invoke(entity)); } catch (Exception e) { logger.warn("initialization exception", e); } } } } finally { session.close(); } } 放置 Utils.objectToJson(entity);会议结束前致电。 或者你可以尝试设置获取模式并使用这样的代码 Session s = ... DetachedCriteria dc = DetachedCriteria.forClass(MyEntity.class).add(Expression.idEq(id)); dc.setFetchMode("innerTable", FetchMode.EAGER); Criteria c = dc.getExecutableCriteria(s); MyEntity a = (MyEntity)c.uniqueResult(); 当必须获取多个集合时,您需要: 加入获取一个集合 使用 Hibernate.initialize 收集剩余的集合。 因此,就您的情况而言,您需要像这样的第一个 JPQL 查询: MyEntity entity = session.createQuery("select e from MyEntity e join fetch e.addreses where e.id = :id", MyEntity.class) .setParameter("id", entityId) .getSingleResult(); Hibernate.initialize(entity.persons); 这样,您可以通过 2 个 SQL 查询来实现您的目标,并避免笛卡尔积。 Hibernate 4.1.6 引入了一个新功能来处理这些惰性关联问题。当您在 hibernate.properties 或 hibernate.cfg.xml 中启用 hibernate.enable_lazy_load_no_trans 属性时,您将不再有 LazyInitializationException 。 更多信息请参阅:https://stackoverflow.com/a/11913404/286588 这可能不是最佳实践,但我通常在集合上调用 SIZE 以在同一事务中加载子级,就像您所建议的那样。它很干净,不受子元素结构中任何变化的影响,并且生成的 SQL 开销较低。 如果您使用 jpa 存储库, 设置properties.put("hibernate.enable_lazy_load_no_trans",true);到 jpaPropertymap JPA-Hibernate 中对惰性集合存在一些误解。首先我们要明确的是 为什么尝试读取惰性集合会引发异常,而不仅仅是简单地返回 NULL 进行转换或进一步使用?. 这是因为数据库中的空字段(尤其是连接列中的空字段)有意义,而不仅仅是像编程语言那样的未呈现状态。 当您尝试将惰性集合解释为 Null 值时,这意味着(在数据存储端)这些实体之间没有关系,这不是真的。所以抛出异常是某种最佳实践,你必须处理它而不是 Hibernate。 所以如上所述,我建议: 在修改或使用无状态会话查询之前先分离所需的对象 将惰性字段操纵为所需值(零、空等) 也如其他答案中所述,有很多方法(热切获取、加入等)或库和方法可以做到这一点,但在处理问题和解决问题之前,您必须建立对正在发生的情况的看法。 您可以使用实体的 @NamedEntityGraph 注释来创建可加载查询,以设置要在查询中加载的集合。 这种方法的主要优点是,只有当您选择使用此图时,hibernate 才会进行一次查询来检索实体及其集合,如下所示: 实体配置 @Entity @NamedEntityGraph(name = "graph.myEntity.addressesAndPersons", attributeNodes = { @NamedAttributeNode(value = "addresses"), @NamedAttributeNode(value = "persons") }) 用法 public MyEntity findNamedGraph(Object id, String namedGraph) { EntityGraph<MyEntity> graph = em.getEntityGraph(namedGraph); Map<String, Object> properties = new HashMap<>(); properties.put("javax.persistence.loadgraph", graph); return em.find(MyEntity.class, id, properties); } 使用或多或少的标准 JPA 来做到这一点的一种方法是添加 @NamedEntityGraph(includeAllAttributes = true) 您的实体将提供一个与您的实体名称相同的命名实体图(因为未提供名称)。 然后假设您已经从现有方法中获得了entity,那么可以将以下代码应用于它 // this is needed to ensure the existing // object that you have retrieved is disconnected // from the entity manager, otherwise the find // method will return the same object. entityManager.detach(entity); // Locate the entity graph based on the class name of the entity. EntityGraph<?> entityGraph = entityManager.getEntityGraph( entityManager .getMetamodel() .entity(entity.getClass()).getName()); var fullyLoadedEntity = entityManager .find( entity.getClass(), entity.getId(), Map.of( // SpecHints is hibernate specific the value is // "jakarta.persistence.loadgraph" SpecHints.HINT_SPEC_LOAD_GRAPH, entityGraph)); 尝试使用Gson库将对象转换为Json servlet 示例: List<Party> parties = bean.getPartiesByIncidentId(incidentId); String json = ""; try { json = new Gson().toJson(parties); } catch (Exception ex) { ex.printStackTrace(); } response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(json);

回答 12 投票 0

nuxt 延迟加载插件与 vue 2.6.12

我构建了简单的 vue js 插件(vee-validate 上的包装器),并希望在组件水合和加载时包含它,但是面临 vue 的问题,不允许在应用程序之后注册组件

回答 1 投票 0

Ruby 中的惰性求值

我遇到了 Ruby 的情况,可能需要创建一个对象,但不确定。由于创建对象的成本可能很高,所以我不太急于创建它。我觉得这个...

回答 3 投票 0

如何在Flutter ListView中实现像whatsapp聊天屏幕那样的Lazyload

我试图了解如果我们滚动到顶部,WhatsApp 聊天屏幕如何获取旧聊天记录。 同样,我想在到达对话顶部时进行延迟加载。就我而言,假设 10,000

回答 1 投票 0

仅在开发模式下延迟加载React-hook-form devtools

嘿我希望延迟加载 Devtools 组件并仅在环境为“development”时加载它 我试过这个: 在组件本身我有这个 process.env?.NODE_ENV === '开发' &...

回答 1 投票 0

错误:“insight-dashboard-erneuerung-settings”在实现延迟加载时不是已知元素

我正在尝试在 Angular 项目中为仪表板模块设置延迟加载,但遇到错误: “insight-dashboard”不是已知元素: 如果“insight-dashboard”是一个 Angular com...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.