Tag: 延迟加载

JPA延迟加载性能有多重要?

我理解这对于具体的应用是非常具体的,但我只是想知道一般意见是什么,或者至少在这个问题上有一些个人经验。 我对“视图中的开放会话”模式感到厌恶,所以为了避免这种情况,我正在考虑简单地抓取所有内容,并在服务层中使用查询来获取更大的内容。 有人用这个并后悔了吗? 是否有一些优雅的解决方案可以在视图层中延迟加载我不知道的?

如何在hibernate中延迟加载多对多集合?

我可以懒惰加载一对多和多对一的关联,但我不能与多对多关联。 我们有一个城市,我们有商人有地址。 商家可以拥有多个地址,多个商家可以拥有相同的地址。 当我们用get获取商家时, Merchant merchant = (Merchant) hib_session.get(Merchant.class, id); System.out.println(merchant.getName()); 没关系,在我们遍历它们之前,地址不会加载。 但是当我们加载商家列表时, City city = (City) hib_session.get(City.class, city_name); for(Merchant merchant : city.getMerchants()) { System.out.println(merchant.getName()); } 即使我们没有获取地址,hibernate也会自动加载它们。 这是我的问题的一个例子。 映射: 有任何想法吗 ?

强制hibernate在不改变映射的情况下急切地加载多个关联

我有一些实体具有懒惰的一对多关系(为简洁省略了逻辑): @Entity class A{ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = “a_pk”, nullable = false) List blist = new ArrayList(); @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = “a_pk”, nullable = false) List clist = new ArrayList(); @Column(name = “natural_identifier”, nullable = false) private String id; } @Entity class B{ } @Entity class C{ […]

强制加载其他延迟加载的属性

我有一个Hibernate对象,其属性都是懒惰加载的。 大多数这些属性是其他Hibernate对象或PersistentSets。 现在我想强制Hibernate一次性加载这些属性。 当然,我可以用object.getSite().size() “触摸”这些属性中的每一个,但也许还有另一种方法来实现我的目标。

为什么懒惰加载不能在一对一关联中工作?

@Entity public class Person { @Id @GeneratedValue private int personId; @OneToOne(cascade=CascadeType.ALL, mappedBy=”person”, fetch=FetchType.LAZY) private PersonDetail personDetail; //getters and setters } @Entity public class PersonDetail { @Id @GeneratedValue private int personDetailId; @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) private Person person; //getters and setters } 当我做 Person person1=(Person)session.get(Person.class, 1); 我看到两个查询被解雇了。 一个用于获取人员数据,另一个用于获取人员详细数据。 根据我的理解,应该只触发1个查询,用于获取人员数据而不是人员详细数据,因为我已经提到了延迟加载。 为什么personDetail数据与人员数据一起被提取?

org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话

我有两个物理服务器,我的Web应用程序由负载均衡器管理。 我总是得到 – org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话 当其中一个服务器被命中而另一个服务器顺利运行而没有任何问题。 我有一个由应用程序启用和管理的本地托管缓存存储。 只有在尝试从一个表访问一个特定列时才会发生此exception。 无论哪个服务器被击中,其余的操作都可以正常工作。 使lazy = false将成为性能问题,因为该表上的行数非常大。 顺便说一句,我们在会话中使用get(object)而不是load(object)。

什么时候在hibernate中使用Lazy loading / Eager加载?

我相信只有两种使用Hibernate加载对象的方法,即延迟加载,一种是急切加载。 延迟加载有其自身的优点,它不会加载大量对象,而只是在您需要它们时。 我还了解到,如果你想强制加载一个对象的所有子项,你可以简单地调用parent.getChildren().size() 。 所以我们假设我们有以下对象 @Entity public class Customer{ public Set order; } @Entity public class Order{ } 让我们假设我们的客户在我们的系统中有订单,它可能不止一个甚至是空的。 所以我的问题是在这种情况下总是使用急切加载不是更好吗? 我们需要与客户相关的订单的大小或一些信息。 在这种情况下使用延迟加载有什么好处,有什么好处吗? 我试图了解在哪里使用延迟加载以及在哪里使用预先加载,非常感谢您的洞察力。

Hibernate – 字节码检测和字节码增强之间的区别?

我正在使用Hibernate 4.2和构建时间字节码检测来解决@OneToOne关系和@Lob上出现的懒惰问题( https://developer.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one ) 你知道之间有什么区别: Hibernate字节码检测: http : //docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch20.html#performance-fetching-lazyproperties Hibernate字节码增强: http : //docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch20.html#bytecode-enhancement 因为在hibernate文档中,它写成: EnhancementTask旨在作为InstrumentTask的完全替代品。 此外,它也与InstrumentTask不兼容,因此需要再次从源构建任何现有的检测类。 我可以通过使用字节码检测来解决我的问题,但它不能通过使用字节码增强来工作。 你知道为什么吗 ? 也许,这个新function还没有完全开发出来? 谢谢你的帮助。

Java JDBC Lazy-Loaded ResultSet

有没有办法获得从运行JDBC查询获得的ResultSet来延迟加载? 我希望每行都按照我的要求加载,而不是事先加载。

Hibernate – 避免LazyInitializationException – 从代理和会话中分离对象

MyObject myObject = repositoryHibernateImpl.getMyObjectFromDatabase(); //transaction is finished, and no, there is not an option to reopen it ThirdPartyUtility.doStuffWithMyObjectType( myObject ); 在这一点上你已经定义了什么是懒惰和急切加载,第三方实用程序将尝试调用你的“myObject”实例上的所有方法,这很好,因为你不想为懒惰返回任何东西加载属性,遗憾的是它不返回null,它抛出一个LazyInitializationException 。 发生这种情况是因为您实际上是在Hibernate的对象代理上调用该方法,并且它知道它没有获取该数据,并抛出exception。 甚至可以使用null值获取底层对象,以便getter只返回null,并且不会抛出exception? 基本上分离对象,以便Hibernate完全不再了解它。 延迟加载的对象的访问器必须返回null,它不能返回实际值,我们希望能够将实体转换为POJO,而不必创建看起来像实体的对象,并且必须重新映射所有值。