tutorial teoria serializacion relaciones propiedades por persistencia mapeo ejemplo java hibernate orm proxy hibernate-mapping

java - teoria - propiedades de hibernate



¿Qué contiene el objeto proxy de Hibernate? (1)

Como se explica en mi libro, Persistencia de Java de alto rendimiento , el Proxy de Hibernate se utiliza para sustituir una entidad real POJO (Objeto Java antiguo simple).

La clase Proxy se genera en tiempo de ejecución y amplía la clase de entidad original.

Hibernate usa objetos Proxy para entidades para permitir la carga diferida .

Al acceder a propiedades básicas en el Proxy, simplemente delega la llamada a la entidad original.

Cada List , Set , tipo de Map en la clase de entidad se sustituye por una lista PersistentList , conjunto PersistentSet , Map PersistentMap . Estas clases son responsables de interceptar una llamada a una colección no inicializada.

El Proxy no emite ninguna declaración SQL. Simplemente desencadena un InitializeCollectionEvent , que es manejado por el oyente asociado, que sabe qué consulta de inicialización emitir (depende del plan de recuperación configurado).

Todo lo que pude deducir de Google es que:

  • Hibernate usa un objeto proxy para implementar la carga diferida. Cuando solicitamos cargar el objeto desde la base de datos, y el objeto recuperado tiene una referencia a otro objeto concreto, Hibernate devuelve un proxy en lugar del objeto asociado concreto.

  • Hibernate crea un objeto proxy utilizando instrumentación bytecode (proporcionado por javassist). Hibernate crea una subclase de nuestra clase de entidad en tiempo de ejecución utilizando la biblioteca de generación de código y reemplaza el objeto real con el proxy creado recientemente.

Entonces, ¿qué contiene exactamente el objeto Proxy?

¿Contiene un objeto de referencia de objeto esqueleto con solo el campo de identificación establecido? ¿Otro campo se establecerá cuando llamemos al método get?

¿El objeto Proxy contiene la instrucción JDBC para recuperar todos los datos necesarios para completar completamente el objeto al que se hace referencia?

¿Hay algo más que me pueda estar perdiendo?

No estoy pidiendo alimentación con cuchara, pero si puede proporcionar algún enlace con información que sería genial.

Cualquier corrección a la descripción anterior también será bienvenida.

Ejemplo.

class Address { String city; String country; } class Person{ int id; String name; Address address; }

Cuando intentemos cargar el objeto Person, Hibernate clasificará la clase Person como:

class ProxyPerson extends Person { int id; String name; Address proxyCGLIBObject; }

y devolver un objeto ProxyPerson. El objeto de ProxyPerson tendrá un valor para id y name pero proxy para Address.

¿Estoy en lo correcto?

¿Qué puedo esperar al agregar un método toString () en el objeto proxy?