2011-12-27 123 views
2

当调用load时,Hibernate会检查对象是否已经包含在会话中。如果这是真的,则返回对象,否则创建代理。无法理解休眠中的会话

会话用于与数据库进行交互,它在加载方法中传递对象时如何包含对象。那么代理在什么地方使用。

+0

由于性能原因,会话也是第一级缓存(在内存中)。 CGLIB代理被创建以促进实体/集合的延迟加载。 – aishwarya 2011-12-27 11:21:49

回答

1

代理只是围绕真实物体的信封。当您致电session.load(Person.class, 3)时,Hibernate将检查ID为3的人是否已经在会话缓存中。如果不是,它将创建一个代理,将其存储在会话缓存中并返回。代理是这样工作的类:

public class PersonProxy extends Person { 
    private int id; 
    private boolean initialized = false; 

    public String getName() { 
     if (!initialized) { 
      // read state of the entity from database; 
      initialized = true; 
     } 
     return this.name; 
    } 

    ... 
} 
+0

当会话关闭时,第一级缓存总数是否被清除? – 2011-12-30 10:28:24

+0

是的。第一级缓存由会话维护。如果关闭会话,则会清除其第一级缓存。 – 2011-12-30 10:32:48

+0

如果另一个线程打开一个会话,那么这个代理是否可用?如果不是性能问题在哪里?如果ID为3的人没有关闭,它是否可以在整个应用程序中使用? – 2011-12-30 12:06:12