Notez que la fonctionnalités suivantes sont actuellement considérées comme expérimentales et peuvent changer dans un futur proche.
Les entités persistantes ne doivent pas nécessairement être représentées comme des classes POJO ou des objets JavaBean à l'exécution.
Hibernate supporte aussi les modèles dynamiques (en utilisant des Map
s de Map
s à l'exécution) et la représentation des entités comme des arbres DOM4J. Avec cette approche, vous n'écrivez pas de classes
persistantes, seulement des fichiers de mapping.
Par défaut, Hibernate fonctionne en mode POJO normal. Vous pouvez paramétrer un mode de représentation d'entité par défaut
pour une SessionFactory
particulière en utilisant l'option de configuration default_entity_mode
(voir Tableau 3.3, « Propriétés de configuration d'Hibernate »).
Les exemples suivants démontrent la représentation utilisant des Map
s. D'abord, dans le fichier de mapping, un entity-name
doit être déclaré au lieu (ou en plus) d'un nom de classe :
<hibernate-mapping> <class entity-name="Customer"> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <property name="name" column="NAME" type="string"/> <property name="address" column="ADDRESS" type="string"/> <many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/> <bag name="orders" inverse="true" lazy="false" cascade="all"> <key column="CUSTOMER_ID"/> <one-to-many class="Order"/> </bag> </class> </hibernate-mapping>
Notez que même si des associations sont déclarées en utilisant des noms de classe cible, le type de cible d'une association peut aussi être une entité dynamique au lieu d'un POJO.
Après avoir configuré le mode d'entité par défaut à dynamic-map
pour la SessionFactory
, nous pouvons lors de l'exécution fonctionner avec des Map
s de Map
s :
Session s = openSession(); Transaction tx = s.beginTransaction(); Session s = openSession(); // Create a customer Map david = new HashMap(); david.put("name", "David"); // Create an organization Map foobar = new HashMap(); foobar.put("name", "Foobar Inc."); // Link both david.put("organization", foobar); // Save both s.save("Customer", david); s.save("Organization", foobar); tx.commit(); s.close();
Les avantages d'un mapping dynamique sont un gain de temps pour le prototypage sans la nécessité d'implémenter les classes d'entité. Pourtant, vous perdez la vérification du typage au moment de la compilation et aurez plus d'exceptions à gérer lors de l'exécution. Grâce au mapping d'Hibernate, le schéma de la base de données peut facilement être normalisé et solidifié, permettant de rajouter une implémentation propre du modèle de domaine plus tard.
Les modes de représentation d'une entité peut aussi être configuré par Session
:
Session dynamicSession = pojoSession.getSession(EntityMode.MAP); // Create a customer Map david = new HashMap(); david.put("name", "David"); dynamicSession.save("Customer", david); ... dynamicSession.flush(); dynamicSession.close() ... // Continue on pojoSession
Veuillez noter que l'appel à getSession()
en utilisant un EntityMode
se fait sur l'API Session
, pas SessionFactory
. De cette manière, la nouvelle Session
partage les connexions JDBC, transactions et autres informations de contexte sous-jacentes. Cela signifie que vous n'avez
pas à appeler flush()
et close()
sur la Session
secondaire, et laissez aussi la gestion de la transaction et de la connexion à l'unité de travail primaire.
Plus d'informations à propos de la représentation XML peuvent être trouvées dans Chapitre 18, Mapping XML.