- Mastering Hibernate
- Ramin Rad
- 350字
- 2021-07-16 10:54:41
Proxy objects
If you are familiar with Java reflection, you have heard of the java.lang.reflect.Proxy
class. In a nutshell, you can wrap any object with a proxy and intercept calls to methods of that object using an invocation handler. Many Java frameworks use proxy objects, or manipulate bytecode (also called instrumentation) to modify the behavior of an object. Hibernate uses both ways for different purposes. More importantly, Hibernate implements its own set of wrapper classes for collection types. (Refer to classes in org.hibernate.collection.internal
.)
If you fetch an entity, Hibernate doesn't fetch the associated collections if they are marked as lazy fetch. Instead, it waits until you actually try to access the associated collection. As soon as you access an entity in the associated collection, Hibernate will fetch the associated entities from the persistence store and will then populate the wrapped collection for you to access. Hibernate accomplishes this using the internal collection wrappers. You can actually examine this yourself by writing a simple check, as follows:
parent = (Parent) session.get(Parent.class, new Long(1));
Set<Child> children = parent.getChildren();
if (children instanceof PersistentSet) {
System.out.println("**** Not java.util.Set");
}
// PersistentSet is located in org.hibernate.collection.internal
Hibernate uses byte code manipulation techniques to initialize an object that is uninitialized. This usually occurs when your entity has an associated entity, for example, a Person
entity that is associated with an Address
entity. When the root
entity, in this case Person
, is loaded from the database, the Address
object is not initialized in case of LAZY
loading. In such cases, Hibernate returns a manipulated version of the associated entity, and as soon as you try to access any of the attributes of the associated entity, for example, address.getStreet()
, Hibernate will hit the database to fetch
the values for the associated entity and initialize it.
Hibernate also returns a proxy object when you ask for an entity using the load
method instead of the get
method of the Session
class.
When working with Hibernate, it is important that you keep in mind how Hibernate uses proxy objects.
- 零起步玩轉掌控板與Mind+
- Go語言高效編程:原理、可觀測性與優化
- Java Web基礎與實例教程(第2版·微課版)
- C#程序設計(慕課版)
- Java程序設計與實踐教程(第2版)
- Java深入解析:透析Java本質的36個話題
- 信息技術應用基礎
- Learning JavaScript Data Structures and Algorithms
- Python爬蟲、數據分析與可視化:工具詳解與案例實戰
- C語言程序設計與應用(第2版)
- 量子計算機編程:從入門到實踐
- micro:bit軟件指南
- Python實戰指南:手把手教你掌握300個精彩案例
- HTML 5與CSS 3權威指南(第4版·上冊)
- JavaScript前端開發程序設計教程(微課版)