Hibernate的数据的加载

来源:互联网 发布:java开发周末兼职 编辑:程序博客网 时间:2024/05/10 21:27

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));

都是直接从数据库查询返回数据了.注意,这个时候相关联的实体也会加载的.

 

原创粉丝点击