2008-12-24 6 views
12

Au meilleur de ma connaissance, la création d'un proxy Java dynamique nécessite une interface avec laquelle travailler pour le proxy. Pourtant, Hibernate semble gérer sa génération de proxy dynamique sans avoir besoin d'écrire des interfaces pour les classes d'entités. Comment fait-il cela? Le seul indice de la documentation Hibernate fait référence au fait que les classes doivent avoir au minimum un constructeur paquet-visible pour la génération de proxy.Comment Hibernate crée-t-il des proxies de classes concrètes?

Est-ce que Hibernate fait de l'ingénierie bytecode d'exécution avec un classloader personnalisé? La documentation suggère que ce n'est pas le cas. Alors, comment créent-ils leurs wrappers de proxy autour des objets d'entité concrets? Est-ce qu'ils créent simplement un proxy d'une interface triviale sans se soucier de la sécurité du type, puis la transforment comme vous le souhaitez?

Répondre

3

Pour utiliser le créateur de proxy qui est en Java, oui, vous avez raison, mais je crois que Hibernate utilise CGLib pour générer ses proxys.

http://cglib.sourceforge.net/

C'est un programme frais, __gVirt_NP_NN_NNPS<__ et ne nécessite pas d'interfaces pour générer un proxy.

(et peut-être qu'un jour, hibernate passera à utiliser AOP et le monde sera un meilleur endroit).

+0

oui, il ne cglib –

4

Hibernate utilise le fournisseur de bytecode configuré hibernate.properties, par exemple:

hibernate.bytecode.provider=javassist