好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用延迟初始化(这很明显)。所以,想象一下下面的类:
@Entity
public class Person{
@Column
private String name;
@ManyToOne(fetch = FetchType.Lazy)
@JoinColumn(name = "id_type")
private TypePerson 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 对象,并在控制台上打印人员的类型。在这一刻,代理 CGLIB 工作并发挥你的作用,一切正常。
但在这里我提出我的问题:
1 - 当我请求“getType()”时,休眠(或其他机制)在幕后进行 SQL 查询?比如:“SELECT * FROM TypePerson where id = 3”。
如果答案是肯定的:这种获取属性值的方法可能非常痛苦,因为我认为 Hibernate 每次都会在数据库中获取这些信息。
如果答案是否定的:如果不是从数据库加载,代理如何知道属性的值?