`
1682234
  • 浏览: 1809 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

fetch = FetchType.EAGER 作用

阅读更多

如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中

如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)。

但是,在session外,就不能再取了。用EAGER时,因为在内存里,所以在session外也可以取。

 

一般只在一边设Eager,JPA接口默认为一对多为Lazy,多对一为Eager,但是Hibernate反向工程生成Entity时,多对一为Lazy,需要手动改为Eager

 

而两边都设Eager,那么代码中取一条记录时,会发2次SQL。

 

Tgroup:

Java代码  收藏代码
  1. package com.hibernate.entity;  
  2.   
  3. import java.util.HashSet;  
  4.   
  5. /** 
  6.  * Tgroup entity. @author MyEclipse Persistence Tools 
  7.  */  
  8. @Entity  
  9. @Table(name = "tgroup", catalog = "test")  
  10. public class Tgroup implements java.io.Serializable {  
  11.   
  12.     // Fields  
  13.   
  14.     /** 
  15.      *  
  16.      */  
  17.     private static final long serialVersionUID = -7208715716759269846L;  
  18.     private Integer id;  
  19.     private String name;  
  20.     private Set<Tuser> tusers = new HashSet<Tuser>(0);  
  21.   
  22.     // Constructors  
  23.   
  24.     /** default constructor */  
  25.     public Tgroup() {  
  26.     }  
  27.   
  28.     /** full constructor */  
  29.     public Tgroup(String name, Set<Tuser> tusers) {  
  30.         this.name = name;  
  31.         this.tusers = tusers;  
  32.     }  
  33.   
  34.     // Property accessors  
  35.     @Id  
  36.     @GeneratedValue  
  37.     @Column(name = "id", unique = true, nullable = false)  
  38.     public Integer getId() {  
  39.         return this.id;  
  40.     }  
  41.   
  42.     public void setId(Integer id) {  
  43.         this.id = id;  
  44.     }  
  45.   
  46.     @Column(name = "name")  
  47.     public String getName() {  
  48.         return this.name;  
  49.     }  
  50.   
  51.     public void setName(String name) {  
  52.         this.name = name;  
  53.     }  
  54.   
  55.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tgroup")  
  56.     public Set<Tuser> getTusers() {  
  57.         return this.tusers;  
  58.     }  
  59.   
  60.     public void setTusers(Set<Tuser> tusers) {  
  61.         this.tusers = tusers;  
  62.     }  
  63.   
  64. }  

 

 

Tuser:

Java代码  收藏代码
  1. package com.hibernate.entity;  
  2.   
  3. import javax.persistence.Column;  
  4.   
  5. /** 
  6.  * Tuser entity. @author MyEclipse Persistence Tools 
  7.  */  
  8. @Entity  
  9. @Table(name = "tuser", catalog = "test")  
  10. public class Tuser implements java.io.Serializable {  
  11.   
  12.     // Fields  
  13.   
  14.     /** 
  15.      *  
  16.      */  
  17.     private static final long serialVersionUID = -7792597282750540598L;  
  18.     private Integer id;  
  19.     private Tgroup tgroup;  
  20.     private String name;  
  21.   
  22.     // Constructors  
  23.   
  24.     /** default constructor */  
  25.     public Tuser() {  
  26.     }  
  27.   
  28.     /** full constructor */  
  29.     public Tuser(Tgroup tgroup, String name) {  
  30.         this.tgroup = tgroup;  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     // Property accessors  
  35.     @Id  
  36.     @GeneratedValue  
  37.     @Column(name = "id", unique = true, nullable = false)  
  38.     public Integer getId() {  
  39.         return this.id;  
  40.     }  
  41.   
  42.     public void setId(Integer id) {  
  43.         this.id = id;  
  44.     }  
  45.   
  46.     @ManyToOne(fetch = FetchType.EAGER)//<span style="color: #ff0000;">注意这行代码</span>  
  47.   
  48.   
  49.   
  50.   
  51.   
  52.   
  53.   
  54.     @JoinColumn(name = "groupid")  
  55.     public Tgroup getTgroup() {  
  56.         return this.tgroup;  
  57.     }  
  58.   
  59.     public void setTgroup(Tgroup tgroup) {  
  60.         this.tgroup = tgroup;  
  61.     }  
  62.   
  63.     @Column(name = "name")  
  64.     public String getName() {  
  65.         return this.name;  
  66.     }  
  67.   
  68.     public void setName(String name) {  
  69.         this.name = name;  
  70.     }  
  71.   
  72. }  
 

Java代码  收藏代码
  1. @ManyToOne(fetch = FetchType.EAGER)//注意这行代码  
  2. @JoinColumn(name = "groupid")  
  3.     public Tgroup getTgroup() {  
  4.         return this.tgroup;  
  5.     }  

 时

 

Java代码  收藏代码
  1. @Test  
  2.     public void getUser() {  
  3.         Session s = sessionFactory.getCurrentSession();  
  4.         s.beginTransaction();  
  5.         Tuser user = (Tuser)s.get(Tuser.class1);  
  6.         System.out.println(user.getName());  
  7.         s.getTransaction().commit();  
  8.         System.out.println(user.getTgroup().getName());//这行代码OK,当然,也可以把这行代码放在commit()之前  
  9.     }  

 

如果

Java代码  收藏代码
  1. @ManyToOne(fetch = FetchType.LAZY)//注意这行代码  
  2. @JoinColumn(name = "groupid")  
  3.     public Tgroup getTgroup() {  
  4.         return this.tgroup;  
  5.     }  

时,

Java代码  收藏代码
  1. @Test  
  2.     public void getUser() {  
  3.         Session s = sessionFactory.getCurrentSession();  
  4.         s.beginTransaction();  
  5.         Tuser user = (Tuser)s.get(Tuser.class1);  
  6.         System.out.println(user.getName());  
  7.         s.getTransaction().commit();  
  8.         System.out.println(user.getTgroup().getName());//这行代码错误,不过,这行代码放在commit()之前,是正确的。  
  9.     }  

 

分享到:
评论

相关推荐

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    对于一对多的关系,可以使用`@OneToMany(fetch = FetchType.EAGER)`或`@ManyToOne(fetch = FetchType.EAGER)`来指定。然而,过度使用急加载可能会导致性能下降,因为它会增加初始查询的复杂性和数据量。 2. Batch ...

    hiberante - one to many - update

    在`@OneToMany`注解中,需要指定集合类型和实现类,例如`mappedBy = "parent", targetEntity = Child.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)`。 4. **孤儿删除**:`...

    Hibernate教程15_关联关系中的CRUD Cascade_Fetch

    `@ManyToOne(fetch = FetchType.EAGER)`表示多对一关系的加载策略为立即加载,`@OneToMany(fetch = FetchType.LAZY)`表示一对多关系的懒加载。 5. 源码分析: 压缩包中的`s2sh_relation12_one2many_many2one_bi_...

    Hibernate 1+N问题详解

    根据题目中的描述,“Hibernate的两个类设置了manyToOne之后,在查询的时候,由于N对1的一方默认的fetch=FetchType.EAGER,所以会把被关联的对象一起取出来”。这表明,在进行查询时,默认情况下,当一个实体包含另一...

    SpringBoot-SpringData-懒加载

    2. 使用Eager Loading(即`FetchType.EAGER`)预加载关联数据,减少SQL查询次数。 3. 使用Spring Data的`@Query`注解自定义SQL或HQL,进行更精细的数据加载控制。 4. 考虑使用批次加载(Batch Fetching),减少...

    Hibernate一对一关联映射(注解)

    4. **fetch**:加载策略,FetchType.LAZY表示延迟加载,FetchType.EAGER表示立即加载。 5. **optional**:是否允许为null,true表示可以为null,false表示不能为空。 6. **mappedBy**:用于指定另一方的引用字段,...

    java搜索 compass资料

    @OneToMany(cascade = {CascadeType.REMOVE, CascadeType.PERSIST}, mappedBy = "product", fetch = FetchType.EAGER) @OrderBy("visible desc, id asc") @SearchableReference public Set&lt;ProductStyle&gt; get...

    hibernate5--4.检索方式及策略

    可以通过在实体关系映射中设置`fetch=FetchType.EAGER` 来实现。 4. **Batch Size**: Hibernate允许设置批处理大小,以减少数据库交互次数。例如,`@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,...

    hibernate中处理大字段 网上收集的文档

    这可以通过`@Basic(fetch = FetchType.EAGER)`或XML映射中的`fetch="EAGER"`实现。 四、性能优化策略 1. 使用流处理:对于大数据字段,避免一次性加载到内存中,而是使用流式读写。Hibernate支持通过`InputStream`...

    hibernate一对一

    - 使用`fetch = FetchType.EAGER`来立即加载关联对象,适合关联数据较小的情况。 - 适当使用`@Cacheable`和二级缓存,减少数据库访问。 ### 7. 结论 理解并熟练掌握Hibernate的一对一关联映射对于提高Java开发效率...

    JPA 批注参考

    - `@ManyToOne(fetch = FetchType.EAGER)` FetchType 注解用于控制关联关系的加载策略。LAZY表示延迟加载,直到真正需要时才加载关联对象;EAGER则表示立即加载。 7. **自动生成(GeneratedValue)策略** `...

    JPA_3_一对一关联关系源码

    即时加载(EAGER)则会在加载主对象时一起加载关联对象,可以通过`fetch = FetchType.EAGER`来设置。 **5. 实际应用** 一对一关联在很多场景下都有应用,如用户和其个人资料,车辆和其所有者等。这种关联关系可以...

    Hibernate Many-To-Many Mapping Annotations

    如果希望在加载主实体时一并加载关联实体,可以使用`fetch = FetchType.EAGER`。 2. **级联操作**:使用`cascade`属性可以定义级联操作,如`CascadeType.ALL`将允许在操作主体实体时自动处理关联实体的CRUD操作。 ...

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

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

    集成spring的hibernate懒加载

    2. **Eager Fetching**:通过设置`fetch = FetchType.EAGER`,在初始加载实体时就加载关联的对象。但这可能导致性能下降,因为即使不需要关联对象,也会加载它们。 3. **Hibernate的Hibernate.initialize()方法**:...

    Hibernate总结[包含代码段]

    立即加载(Eager Loading)则是在查询时就加载关联对象,通常通过`fetch = FetchType.EAGER`实现。 **HQL 和 Criteria 查询** HQL(Hibernate Query Language)是面向对象的查询语言,类似SQL,但操作的是对象。...

    JPA读写数据库java代码

    急加载可以通过`@ManyToOne(fetch = FetchType.EAGER)`等方式设置。 在提供的`JPADemo1`压缩包中,可能包含了创建实体、配置`persistence.xml`、执行基本的增删改查操作以及可能的事务管理示例代码。通过学习和理解...

    hibernate注解大全

    @Basic(fetch = FetchType.EAGER) private String username; // ... } ``` 其中,`fetchType`可以设置为`EAGER`或`LAZY`,分别表示立即加载和延迟加载。 7. `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@...

Global site tag (gtag.js) - Google Analytics