1.执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;
/**执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。**/
2.当前的对象如果不存在时,那么需要到数据库去查询
当你调用load()方法时,事实上他可能并没有真正的去查询数据库,那么要如何马上让他去查询呢
有两种办法:
第一种是:调用完load方法时把马上使用所加载的对象(看不懂的话先看第二种)
第二种是:只要把相对应的对象的配置文件中的lazy设置为false;
这就是hibernate的延迟加载机制(lazy),如果把lazy设置为false,则不使用延迟加载;如果设置为true则使用延迟加载,只有使用到所加载的对象时才会去查询
例如:
有一个类他的配置文件为:
<hibernate-mapping>
<class name="Events" table="events" catalog="hibernate" lazy="true" >
<id name="eventId" type="java.lang.Integer">
<column name="EVENT_ID" />
<generator class="native" />
</id>
<!-- 其他配置信息 -->
</class>
</hibernate-mapping>
第一次调用load的代码为:
//把hibernate.cfg.xml中添加
//<property name="show_sql">true</property>
//也就是当服务器去操作数据库时输出所对应的sql
Events anEvent = (Events) session.load(Events.class, eventId);
//事实上这个时候输出并没有真正的去查询数据库
//请看一下配置:
//<class name="Events" table="events" catalog="hibernate" lazy="true" >
//所对应的元素的lazy被设置为true了
//你把lazy设置为false,可以发现调用完上面的这行代码时
//马上就输出了所对应的sql
//那当lazy为true时,load()要延迟到什么时候才去加载数据(查询数据库)呢
//调用完load()之后,只要使用了该对象时就会去加载数据(查询数据库)
//也同时会把sql输出来了,例如:System.out.println(anEnvent);
假如上面的的Envents类里面有一个Set集合
代码为:
package hibernate.hibernate.event;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Events implements java.io.Serializable {
// Fields
private Set persons = new HashSet();
// Constructors
/** default constructor */
public Events() {
}
public Set getPersons() {
return persons;
}
public void setPersons(Set persons) {
this.persons = persons;
}
}
所对应的配置为
<hibernate-mapping>
<class name="hibernate.hibernate.event.Events" table="events" catalog="hibernate" lazy="false" >
<id name="eventId" type="java.lang.Integer">
<column name="EVENT_ID" />
<generator class="native" />
</id>
<!--其他配置信息-->
<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
<key column="EVENT_ID"></key>
<many-to-many column="PERSON_ID" class="hibernate.hibernate.person.Person"></many-to-many>
</set>
</class>
</hibernate-mapping>
//此时如何不调用EventsObj.getPersons();
//或者不使用persons这个集合的属性
//session.load(anEvent);也是不会加载persons这个集合的
//请看配置<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
//其中的lazy也是为false,所以将设置为true将不会延迟加载
//或者马上就使用这个集合
分享到:
相关推荐
延迟加载的生效时间与`Session`的生命周期相同,一旦`Session`关闭,延迟加载就失效。因此,需要注意在合适的时机关闭`Session`,以防止在`Session`关闭后尝试访问延迟加载的关联对象导致异常。 **配置延迟加载策略...
此时Hibernate只会在`sess.load()`方法中检查Session缓存,如果没有找到对应的实体对象,它并不会立即执行SQL查询。只有当访问`tfag2`的某个属性或方法时,Hibernate才会真正执行SQL查询。 ##### 3. 懒加载支持 - *...
#### 二、延迟加载的作用及原理 延迟加载的核心思想是在真正需要数据的时候才进行加载,而不是在一开始就加载所有相关的数据。这样可以避免不必要的数据库查询,减少内存消耗,提高应用性能。 当一个实体被加载时...
但与实体和集合的延迟加载不同,属性延迟加载通常需要配合二级缓存来实现,因为它需要在不加载整个对象的情况下,单独加载或更新某个属性。 总的来说,延迟加载策略有效地减少了对数据库的访问频率,提高了应用程序...
- **缓存策略**:结合Hibernate的一级缓存和二级缓存,可以进一步提升延迟加载的效果。通过适当的缓存策略,可以避免频繁的数据库查询,从而提高系统的整体性能。 - **错误处理**:需要注意的是,延迟加载可能会导致...
这是因为`load`方法假设给定的ID肯定在数据库中存在,它采用延迟加载策略,先返回代理对象,当尝试访问对象属性时才会真正去数据库查询。如果此时数据库中无记录,则抛出异常。 - 相反,`get`方法在找不到对应记录...
1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...
- `load()`方法在延迟加载的场景下更优,只有在真正需要数据时才执行SQL,减少不必要的数据库交互。 总结来说,`get()`和`load()`的主要差异在于执行时机和异常处理。`get()`直接查询数据库并返回实际对象,适合对...
这就是我们常说的load在默认情况下支持延迟加载(lazy)。 从查询数据库的角度看,get()方法和load()方法也存在着区别。如果查询不到数据,get()方法返回null,不会报错,而load()方法则报错...
3.延迟加载(Lazy Loading):对于大对象或关联对象,可采用延迟加载策略,提高程序运行效率。 4. 避免N+1查询问题:在执行一对多或多对多查询时,注意优化避免过多的数据库查询。 总结,HibernateCRUD操作是Java...
1. **延迟加载(Lazy Loading)**: 只在真正需要时才加载关联对象,减少内存占用。 2. **批处理(Batch Processing)**: 一次提交多个操作,提高数据库访问效率。 3. **缓存策略配置**: 选择合适的缓存策略,如使用...
- 查询:`Session.get()`根据ID获取对象,`Session.load()`延迟加载,`Session.createQuery()`或`Session.createSQLQuery()`执行HQL或SQL查询。 5. **查询** - HQL(Hibernate Query Language):面向对象的查询...
4. **检索对象**:`Session.get()`根据ID获取对象,`Session.load()`延迟加载,`Session.createQuery()`或`Session.createCriteria()`执行查询。 **六、事务管理** Hibernate支持编程式和声明式事务管理。编程式...
`Session.save()`, `Session.load()`, `Session.get()`等方法会将对象置于持久化状态。 - **游离状态(Detached)**:对象不再在Session缓存中,但数据库可能仍有记录。关闭Session或调用`Session.evict()`会使得对象...
7. **懒加载与即时加载**: Hibernate提供了懒加载机制,通过`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy = "...', fetch = FetchType.LAZY)`来实现延迟加载,减少初始加载的数据量。...
`Session.load(Class clazz, Serializable id)`方法是延迟加载(Lazy Loading)的代表。它并不会立即执行SQL查询,而是创建一个代理对象,这个代理对象在真正被访问时(如调用其属性或方法)才会执行查询。这是为了...
二级缓存包括应用及缓存、分布式缓存和第三方缓存的实现。 Spring 工作机制 Spring 是一种轻量的控制反转和面向切面容器框架。其工作机制包括: 1. DispatcherServlet 把所有的祈求都提交给 DispatcherServlet,...
1. **延迟加载(Lazy Loading)**:按需加载关联对象,减少不必要的数据库访问。 2. **批处理(Batch Processing)**:通过设置 `hibernate.jdbc.batch_size` 提高批量操作性能。 3. **缓存策略**:合理利用缓存减少...
包括批处理(Batch Processing)、缓存策略调整、延迟加载(Lazy Loading)的合理使用、避免N+1查询问题等,都是提升Hibernate性能的关键。 总结,Hibernate 3.6.8.Final是开发者进行数据库操作的强大工具,通过...
懒加载允许延迟加载关联的对象,以提高性能。而级联操作可以在一个对象操作时,自动处理其关联对象的相关操作。 9. **HQL和SQL的使用** Hibernate 提供了HQL,一种面向对象的查询语言,与SQL类似但更面向对象。...