mercredi 3 août 2011

Bases d'Hibernate

Présentation
Hibernate est une implémentation de l'approche ORM (Object Relational Mapping) qui permet de persister des objets dans un storage (typiquement une base de données).
Le gros avantage de la technologie Hibernate est qu'outre le fait qu'elle soit compatible .net et Java, elle est aussi DB agnostique. L'utilisation du langage de query JPQL (Java Persistence Query Language) permet une traduction dans la plupart des SQL connus et supportés par Hibernate.
L'autre avantage est l'utilisation d'annotations dans le code source, qui permettent d'historiser en une fois le code et le mapping DB correspondant.
Bon une telle approche générique présente des avantages mais aussi des inconvénients:
- on ne sait pas toujours comment Hibernate travaille derrière notre dos, il n'est pas rare de voir des quantités phénoménales d'information retirée par un simple manque de connaissance des options.
- on est toujours limité au plus petit dénominateur commun des vendeurs DB. JPQL ne connaît pas toutes les astuces de chaque RDMS et quand bien même une telle approche nous ramènerait à devoir connaître le RDMS en question d'où pourquoi passer par une couche intermédiaire...

Annotations pour mapping hibernate:
Les annotations se placent toujours sur les getters Java et évitent de devoir utiliser des fichiers XML.

One-To-One
Dans l'entité ConditionDef
@OneToOne(mappedBy = "conditionDef")
sur getItemRef par exemple

Dans l'entité ItemRef:
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "COLLECTEXCEPTCONDID", insertable = false, updatable = false)

La colonne apparaîtra dans l'entité ItemRef cela signifie que l'entité ItemRef est le maître. Si ItemRef est deleté alors ConditionDef sera delete automatiquement, par contre pour deleter ConditionDef il faudra mettre CollectEXCEPTCONDID à null dans la table ItemRef.

One-To-Many
Association classique de 1 vers plusieurs:
La join column sera crée dans l'entité pointée par le targetentity

@OneToMany ((targetEntity = Treatment.class, cascade = {
CascadeType.ALL
})
@JoinColumn(name = "RANDOLISTID")

Many-to-One
Une relation One-To-Many dans une entité doit comprendre une annotation Many-to-One dans l'autre qui référence la même colonne (afin d'éviter qu'hibernate se plante lamentablement)
@ManyToOne
@JoinColumn(name="RANDOLISTID")

Il existe aussi Many-to-Many mais je prefère ne pas en parler !

Créer de nouvelles classes persistentes

A) Modifier Object Facotry (ajouter les creators dans le factory pour récupérer les éléments JAXB)

B) Persistence.xml: ajouter les classes

C) ApplicationContext-orm.xml
ajouter un bean qui construit les daos de ces objets.

D) Module Service réaliser un autowire sur les daos crées.