1.Hibernate3的所有实体和集合的默认的获取的策略都是惰性加载的。
这就是说,hibernate加载一个对象除非你需要查询到到它。我这里假定实体类名是Event ,有两个属性id,name。
我们程序里有这么一句:表示通过主键得到一个Employee对象
Event emp=(Event)session.load(Event.class,new Long(1001));
注意,这个时候数据库里什么都没有加载进内存的。这是因为hibernate使用了代理对象。当hibernate得到一个实体类的一个实例时,它先查看一下是否得到这个类的代理对象而不用查询数据库。
Event emp=(Event)session.load(Event.class,new Long(1001));
emp.getId();
emp.getName();
只有当上面程序的第三句执行的,这个时候代理对象得到初始化,开始真正从数据库读出数据加载到内存中。
这个代理对象是非常有用的,比如我们需要仅仅得到对象的引用时。
请注意;如果使用的是session里的get()方法,这个总是要查询数据库的(如果没有内存中没有的话)。
在JPA里,和hibenate里load()和get()对应的是EntityManager的getReference和find()方法.
现在假定与Event存在*-to-one关联的对象,在加载Event对象的时候,也并不会加载的.A proxy is initialized if you call any method that is not the identifier getter method, a collection is initialized if you start iterating through its elements or if you call any of the collection-management operations, such as size() and contains().
2.禁止使用代理对象,也就是说不延迟加载数据.
简单的设置lazy="false"即可.
例如:
<class name="Event"
table="Events"
lazy="false">
...
</class>
JPA的方式这么写:
@Entity
@Table(name = "Events")
@org.hibernate.annotations.Proxy(lazy = false)
public class Event { ... }
现在:
Event event = (Event) session.load(Event.class, new Long(1001));
Event event = em.getReference(Event.class, new Long(1001));
都是直接从数据库查询返回数据了.注意,这个时候相关联的实体也会加载的.