在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加载数据的时候是一次性加载可能会造成不必要的性能浪费,使用是应该慎重考虑
分享到:
相关推荐
`fetch`决定了字段的加载策略,EAGER表示立即加载,LAZY表示延迟加载(默认)。`optional`表示该属性是否可以为null,默认为true。 6. **@Column**:提供了对数据库表字段的详细描述,如字段名、是否可为null、是否...
在JPA中,为了实现延迟加载,我们可以将`fetch`属性设置为`FetchType.LAZY`。默认情况下,JPA的关系加载是即时的(Eager),这意味着当父实体被加载时,其关联的一对多子实体也会一同加载。然而,通过使用延迟加载,...
可以设置fetch类型(EAGER/LAZY)和cascade类型,以决定何时加载关联的实体以及操作如何传播。 7. **@ManyToOne**: 用于表示一个实体与另一个实体的一对多关系。与@OneToMany类似,也可以设置fetch和cascade属性。 ...
这可以通过在映射关系上设置`fetch = FetchType.EAGER`实现。 #### 5.2 延迟加载(LAZY) 延迟加载允许在需要时才加载关联的实体,提高性能。设置`fetch = FetchType.LAZY`实现。需注意,懒加载在实体已脱管时无法...
4. **Fetch策略**:默认情况下,JPA使用懒加载(Lazy Fetching)策略,这意味着关联的对象不会立即加载,只有在实际访问时才会查询数据库。如果需要立即加载关联,可以设置为急加载(Eager Fetching)。 5. **@...
在"09_传智播客JPA详解_使用JPQL语句进行查询"的课程中,你将深入学习如何利用JPQL进行复杂的查询,包括联合查询、子查询、分页查询以及使用JOIN操作来处理关联数据。通过这个课程,你可以掌握JPA的核心概念和实践...
但可以通过@Basic注解来控制其属性,如fetch策略(EAGER/LAZY)、是否允许为null等。 6. **@Column**: 用于指定字段映射到数据库表的列,可以设置列名、长度、是否允许为null、是否唯一等属性。例如: ```java @...
`mappedBy`属性用于指定反向映射的字段,`fetch`属性则用于指定加载策略,如`EAGER`立即加载或`LAZY`延迟加载。 - **多对多(Many-to-Many)**:这种关系涉及多个实体之间的关联。`@ManyToMany`注解用于映射这种...
在处理大量关联时,需要考虑懒加载(Lazy Loading)和Eager加载(Eager Loading)。默认情况下,JPA使用懒加载,只有在实际访问关联集合时才会触发SQL查询。如果需要在加载实体时立即加载关联,可以使用`fetch = ...
### JPA注解详解 Java Persistence API (JPA) 是一种用于管理关系型数据库对象的标准。JPA 使用注解和 XML 来配置实体类与数据库表之间的映射关系。本文将详细解读 JPA 注解的基本用法,并通过 Hibernate 框架作为...
使用@OneToMany注解定义这种关系,可选参数fetch指定加载策略(EAGER或LAZY),默认是LAZY,表示延迟加载。同时,可以通过@JoinColumn定义外键所在的列。 3. **多对一关联(ManyToOne)** 多对一关联是一对一关联...
还可以设置`fetch`策略(EAGER或LAZY),控制关联数据是否在加载主体对象时一同加载。 3. **多对一(ManyToOne)映射**:多个子对象对应一个父对象,与一对一相反,通过`@ManyToOne`注解实现。同样可设置`fetch`...
1. **延迟加载(Lazy Loading)**:通过`@OneToMany(mappedBy = "..." , fetch = FetchType.LAZY)`避免加载大量数据。 2. **批处理(Batch Processing)**:设置批处理大小,减少数据库交互次数。 3. **缓存...
使用`@OneToMany`注解,可以设置`fetch`策略(如`LAZY`或`EAGER`)来控制加载关联实体的时间,以及`@JoinColumn`或`@JoinTable`来定义关联关系。 3. **多对多(ManyToMany)**:一个实体可以与多个其他实体相互关联...
JPA提供了多种加载策略,包括EAGER和LAZY加载。EAGER加载会在实体被加载时立即加载关联的对象,而LAZY加载则会在第一次访问关联对象时才进行加载,以此来优化性能。例如,如果你有一个`User`实体关联了一个`Address`...
使用`@OneToMany`注解,可以设置`fetch`策略(默认为`LAZY`,表示延迟加载)和`cascade`属性(如`CascadeType.ALL`,表示级联操作)。 3. **多对一(ManyToOne)**: 多个实体可以关联到一个实体,如多个学生属于一...
2. **懒加载(Lazy Loading)与急加载(Eager Loading)**: 通过`@ManyToOne`和`@OneToMany`的`fetch`属性控制关联属性的加载时机。 3. **级联操作(Cascading)**: 可以设置`CascadeType`来决定当父实体操作时,...
7. **懒加载(Lazy Loading)与急加载(Eager Loading)**: JPA支持关联对象的懒加载和急加载策略。默认情况下,关联关系通常是懒加载的,只有在真正需要时才会加载。急加载可以通过`@ManyToOne(fetch = FetchType....
开发者可以通过`@ManyToOne(fetch = FetchType.LAZY)`等方式指定加载策略。 ### 7. **事务管理** JPA的事务管理可以与容器(如Java EE应用服务器)集成,也可以手动管理。在容器管理的事务下,每个业务方法都在一个...
6. **@Basic**: 默认情况下,所有非静态、非transient的字段都被持久化,但可以使用@Basic进行额外配置,如fetch模式(EAGER/LAZY)。 7. **@ManyToOne, @OneToOne, @OneToMany, @ManyToMany**: 这些批注用于定义...