`
sefcertyu
  • 浏览: 249941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jpa抓取策略详解fetch(lazy ,eager)

阅读更多

在jpa中jpa默认的加载方式是lazy方式也就是在实际使用到数据的时候才加载相关数据,使用lazy时可以不用显示注明fetch=FetchType.LAZY

实体bean:carage

package com.hibernate.jpa.bean1;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Garage {

	/**
	 * many to one 多对一
	 */
	private Integer gid;
	private String garagenum;
	private Set<Auto> autos = new HashSet<Auto>();
	
	@Id @GeneratedValue
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	@Column(length=20)
	public String getGaragenum() {
		return garagenum;
	}
	public void setGaragenum(String garagenum) {
		this.garagenum = garagenum;
	}
	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
	public void setAutos(Set<Auto> autos) {
		this.autos = autos;
	}
	public void addGarageAuto(Auto auto) {
		auto.setGarage(this);
		this.autos.add(auto);
	}

}

实体bean:auto

package com.hibernate.jpa.bean1;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Auto {

	/**
	 * one to many 一对多关联
	 */
	private Integer autoId;
	private String autotype;
	private String autonum;
	private Garage garage;

	@Id @GeneratedValue
	public Integer getAutoId() {
		return autoId;
	}
	public void setAutoId(Integer autoId) {
		this.autoId = autoId;
	}
	public String getAutotype() {
		return autotype;
	}
	public void setAutotype(String autotype) {
		this.autotype = autotype;
	}
	public String getAutonum() {
		return autonum;
	}
	public void setAutonum(String autonum) {
		this.autonum = autonum;
	}
	@ManyToOne()
	@JoinColumn(name="garageid")
	public Garage getGarage() {
		return garage;
	}
	public void setGarage(Garage garage) {
		this.garage = garage;
	}

}

junit的测试方法

	@Test public void query() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		
		Garage garage = em.find(Garage.class, 1);

		
		em.close();
		factory.close();
	}

调用query方法的时候发出的sql语句是:

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?

也就是仅仅获取了garage对象,而没有获取与garage关联的auto对象

-----------------

(二)在Garage.java中添加fetch=FetchType.EAGER字段

@OneToMany(cascade={CascadeType.PERSIST},fetch=FetchType.EAGER,mappedBy="garage")
public Set<Auto> getAutos() {
return autos;
}

再次运行query方法,这一次发出的sql语句是:

Hibernate: select garage0_.gid as gid1_1_, garage0_.garagenum as garagenum1_1_, autos1_.garageid as garageid3_, autos1_.autoId as autoId3_, autos1_.autoId as autoId0_0_, autos1_.autonum as autonum0_0_, autos1_.autotype as autotype0_0_, autos1_.garageid as garageid0_0_ from Garage garage0_ left outer join Auto autos1_ on garage0_.gid=autos1_.garageid where garage0_.gid=?

这一次由于将jpa默认的抓取策略改为fetch=FetchType.EAGER

所以jpa在加载数据的时候一次性的加载了和garage相关联的数据

说明:由于fetch=FetchType.EAGER加载数据的时候是一次性加载可能会造成不必要的性能浪费,使用是应该慎重考虑

1
0
分享到:
评论
6 楼 木南飘香 2011-02-24  
楼主很强悍!谢谢了
5 楼 renci 2010-06-05  
楼主我搞错了..sorry
4 楼 renci 2010-06-05  
楼主,我配置的多对多,在配置为lazy时用get怎么取不出来数据

调试的时候用eclipse察看出了这个错
com.sun.jdi.InvocationException occurred invoking method.

但是日志里没哟任何错误,请问这是怎么回事啊?
3 楼 fejay 2009-11-04  
thanks。搞明白了
2 楼 sefcertyu 2009-09-27  
在jpa中jpa默认的加载方式是lazy方式也就是在实际使用到数据的时候才加载相关数据,使用lazy时可以不用显示注明fetch=FetchType.LAZY
releasa 写道
不错,好,牛,好。。呵呵

呵呵,还望多提意见
1 楼 releasa 2009-09-27  
不错,好,牛,好。。呵呵

相关推荐

    JPA注解说明 详解

    `fetch`决定了字段的加载策略,EAGER表示立即加载,LAZY表示延迟加载(默认)。`optional`表示该属性是否可以为null,默认为true。 6. **@Column**:提供了对数据库表字段的详细描述,如字段名、是否可为null、是否...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    在JPA中,为了实现延迟加载,我们可以将`fetch`属性设置为`FetchType.LAZY`。默认情况下,JPA的关系加载是即时的(Eager),这意味着当父实体被加载时,其关联的一对多子实体也会一同加载。然而,通过使用延迟加载,...

    JPA注解详解

    可以设置fetch类型(EAGER/LAZY)和cascade类型,以决定何时加载关联的实体以及操作如何传播。 7. **@ManyToOne**: 用于表示一个实体与另一个实体的一对多关系。与@OneToMany类似,也可以设置fetch和cascade属性。 ...

    07_JPA详解_使用JPA加载_更新_删除对象.zip

    这可以通过在映射关系上设置`fetch = FetchType.EAGER`实现。 #### 5.2 延迟加载(LAZY) 延迟加载允许在需要时才加载关联的实体,提高性能。设置`fetch = FetchType.LAZY`实现。需注意,懒加载在实体已脱管时无法...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    4. **Fetch策略**:默认情况下,JPA使用懒加载(Lazy Fetching)策略,这意味着关联的对象不会立即加载,只有在实际访问时才会查询数据库。如果需要立即加载关联,可以设置为急加载(Eager Fetching)。 5. **@...

    09_JPA详解_使用JPQL语句进行查询.zip

    在"09_传智播客JPA详解_使用JPQL语句进行查询"的课程中,你将深入学习如何利用JPQL进行复杂的查询,包括联合查询、子查询、分页查询以及使用JOIN操作来处理关联数据。通过这个课程,你可以掌握JPA的核心概念和实践...

    JPA-2 基本注解

    但可以通过@Basic注解来控制其属性,如fetch策略(EAGER/LAZY)、是否允许为null等。 6. **@Column**: 用于指定字段映射到数据库表的列,可以设置列名、长度、是否允许为null、是否唯一等属性。例如: ```java @...

    JPA

    `mappedBy`属性用于指定反向映射的字段,`fetch`属性则用于指定加载策略,如`EAGER`立即加载或`LAZY`延迟加载。 - **多对多(Many-to-Many)**:这种关系涉及多个实体之间的关联。`@ManyToMany`注解用于映射这种...

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    在处理大量关联时,需要考虑懒加载(Lazy Loading)和Eager加载(Eager Loading)。默认情况下,JPA使用懒加载,只有在实际访问关联集合时才会触发SQL查询。如果需要在加载实体时立即加载关联,可以使用`fetch = ...

    JPA注解总结

    ### JPA注解详解 Java Persistence API (JPA) 是一种用于管理关系型数据库对象的标准。JPA 使用注解和 XML 来配置实体类与数据库表之间的映射关系。本文将详细解读 JPA 注解的基本用法,并通过 Hibernate 框架作为...

    JPA关联关系

    使用@OneToMany注解定义这种关系,可选参数fetch指定加载策略(EAGER或LAZY),默认是LAZY,表示延迟加载。同时,可以通过@JoinColumn定义外键所在的列。 3. **多对一关联(ManyToOne)** 多对一关联是一对一关联...

    使用jpa映射关联和继承

    还可以设置`fetch`策略(EAGER或LAZY),控制关联数据是否在加载主体对象时一同加载。 3. **多对一(ManyToOne)映射**:多个子对象对应一个父对象,与一对一相反,通过`@ManyToOne`注解实现。同样可设置`fetch`...

    JPA实用讲义

    1. **延迟加载(Lazy Loading)**:通过`@OneToMany(mappedBy = "..." , fetch = FetchType.LAZY)`避免加载大量数据。 2. **批处理(Batch Processing)**:设置批处理大小,减少数据库交互次数。 3. **缓存...

    持久化对象的标准JPA

    使用`@OneToMany`注解,可以设置`fetch`策略(如`LAZY`或`EAGER`)来控制加载关联实体的时间,以及`@JoinColumn`或`@JoinTable`来定义关联关系。 3. **多对多(ManyToMany)**:一个实体可以与多个其他实体相互关联...

    JPA加载_更新_删除对象及使用JPQL语句进行查询

    JPA提供了多种加载策略,包括EAGER和LAZY加载。EAGER加载会在实体被加载时立即加载关联的对象,而LAZY加载则会在第一次访问关联对象时才进行加载,以此来优化性能。例如,如果你有一个`User`实体关联了一个`Address`...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    使用`@OneToMany`注解,可以设置`fetch`策略(默认为`LAZY`,表示延迟加载)和`cascade`属性(如`CascadeType.ALL`,表示级联操作)。 3. **多对一(ManyToOne)**: 多个实体可以关联到一个实体,如多个学生属于一...

    JPA笔记

    2. **懒加载(Lazy Loading)与急加载(Eager Loading)**: 通过`@ManyToOne`和`@OneToMany`的`fetch`属性控制关联属性的加载时机。 3. **级联操作(Cascading)**: 可以设置`CascadeType`来决定当父实体操作时,...

    JPA读写数据库java代码

    7. **懒加载(Lazy Loading)与急加载(Eager Loading)**: JPA支持关联对象的懒加载和急加载策略。默认情况下,关联关系通常是懒加载的,只有在真正需要时才会加载。急加载可以通过`@ManyToOne(fetch = FetchType....

    jpa--2.持久化操作

    开发者可以通过`@ManyToOne(fetch = FetchType.LAZY)`等方式指定加载策略。 ### 7. **事务管理** JPA的事务管理可以与容器(如Java EE应用服务器)集成,也可以手动管理。在容器管理的事务下,每个业务方法都在一个...

    1_JPA_批注参考.

    6. **@Basic**: 默认情况下,所有非静态、非transient的字段都被持久化,但可以使用@Basic进行额外配置,如fetch模式(EAGER/LAZY)。 7. **@ManyToOne, @OneToOne, @OneToMany, @ManyToMany**: 这些批注用于定义...

Global site tag (gtag.js) - Google Analytics