好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类:
@Entity public class Person{ @Column private String name; @ManyToOne(fetch = FetchType.Lazy) @JoinColumn(name = "id_type") private TypePerson type; }
在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”:
public void init(){ //in this point "type" attribute is not initialized Person person = dao.find("Select * from Person where id = 12"); //proxys work here to get description of "type" attribute System.out.println(person.getType().getDescription()); }
因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。
但是,我在这里提出我的问题:
1-当我请求“ getType()”时,Hibernate(或其他机制)在后台进行SQL查询吗?如:“ SELECT * FROM TypePerson,其中id = 3”。
如果答案是肯定的: 这种获取属性值的方法可能会非常痛苦,因为我认为Hibernate每次都会在数据库中进行操作以获取这些信息。
如果答案是否定的: 如果未从dataBase加载Proxy,如何知道该属性的值?
您打电话的时候
person.getType().getDescription()
如果person引用的是尚未初始化的Hibernate代理,则可以,它将发出SQL查询以检索目标实体的字段值。
person
这种获取属性值的方法可能会非常痛苦,因为我认为Hibernate每次都会在数据库中进行操作以获取这些信息。
每个代理服务器只会发送一次。第一次使用时,它将在代理上设置一个标志,指示其已初始化,因此基础目标实体具有正确的值。如果已加载所有值,则无需返回数据库。
这不是Hibernate创建代理的确切方式,但是很好阅读:Proxy Pattern。