package com.lottery.test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "T_PERSON", schema = "XJ")
public class TPerson implements java.io.Serializable {
private Integer id;
private TB TB;
private TA TA;
private String name;
private String age;
public TPerson() {
}
@Id
@GeneratedValue
@Column(name = "ID", unique = true, nullable = false, precision = 20, scale = 0)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID", nullable = false)
public TB getTB() {
return this.TB;
}
public void setTB(TB TB) {
this.TB = TB;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID", nullable = false)
public TA getTA() {
return this.TA;
}
public void setTA(TA TA) {
this.TA = TA;
}
@Column(name = "NAME", length = 20)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "AGE", length = 20)
public String getAge() {
return this.age;
}
public void setAge(String age) {
this.age = age;
}
}
先看上面这个实体类,有两个子类TA和TB,分别使用了延迟加载
下面是测试方法
Session session = HibernateSessionFactory.getSession();
TPerson p =(TPerson) session.get(TPerson.class, 1);
TPerson p1 =(TPerson) session.load(TPerson.class, 1);
//session.close();
TA a = p.getTA();
a.getName();
TB b = p.getTB();
b.getName();
System.out.println(p);
session.get(TPerson.class, 1);
session.close();
先谈get方法,get首先会直接去session缓存去查,没有去二级缓存查,再没有就去数据库查,如果去数据库去查会判断实体中关联的关联实体,如果关联实体使用延迟加载,则不会查询关联实体,只有在使用的时候再去查,且查询关联是使用load方式,如p.getTA()不会查询,a.getName()才会真正去查
get方式及时查,没有返回null
load方式,和get一样先从session缓存查,没有就去二级缓存查,在没有就生成一个代理对象,只有当使用的时候去查
load延迟查,没有抛出ObjectNotFoundException异常
使用延迟必须要注意,因为是延迟查询,所以如果在session关闭后在延迟查询将会抛出session关闭异常
考虑这样一种情况,session管理在Domain层,Domain查询后返回给视图层,在视图层中session是关闭的,如果再使用实体,将会异常,所以使用延迟加载必须考虑这一点
我一直觉得load延迟加载是否有存在的必要,laod的优势是延迟方式来提供性能,问题是难道使用者使用load获取一个实体对象会不使用它???如果会使用,则必须要查,那么延迟又有什么意义呢?
分享到:
相关推荐
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...
### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...
Hibernate延迟加载机制.zip
【hibernate 延迟加载】 在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化数据库访问性能的技术。它允许我们在需要时才加载关联的对象,而不是在初始查询时就一次性加载所有数据。这有助于减少...
《Hibernate延迟加载详解》 Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要...
### Hibernate延迟加载详解 #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许...
集合类型的延迟加载是Hibernate延迟加载机制中最能显著提升性能的部分。在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,...
### Hibernate 延迟加载技术详解 #### 一、概述 在 Hibernate 框架中,延迟加载(Lazy Loading)是一种非常重要的优化技术,它能够有效地减少数据库查询次数,提高应用性能。通常,在多对多或者一对多的关系中,...
### Hibernate延迟加载详解 #### 一、概述 Hibernate 是一种常用的 Java 持久层框架,它能够将 Java 应用程序与底层数据库之间建立桥梁,简化数据访问逻辑。为了提高应用程序性能,Hibernate 提供了多种优化手段,...
Hibernate延迟加载是ORM框架Hibernate中的一个重要特性,它旨在提高应用程序的性能和效率。延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次...
在 Hibernate 框架中,延迟加载(Lazy Loading)是一种优化数据访问性能的重要技术。它允许我们只在真正需要数据时才从数据库加载,避免一次性加载大量数据导致的内存消耗和性能瓶颈。当我们处理与实体相关的集合...
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
本案例主要探讨的是Hibernate的延迟加载(Lazy Loading)机制,这是一种优化数据库访问性能的重要策略。延迟加载允许我们在需要数据时才去加载,而不是在初始化对象时一次性加载所有关联数据,从而减少了内存消耗和...