Hachim IDRISSI YASSINE
contact@proflibre.com
Le : 05 juillet 2020
Hibernate : déclarer une
entité XML
Série : HIBERNATE > L’essentiel
www.proflibre.com
Sommaire
Introduction
Prérequis
Diagramme de classes
La classe JAVA : Personne.java
Schéma relationnel
Structure minimale du fichier *.hbm.xml
Choisir le typage
Remplir la fiche préparatrice
La clé primaire
Catalogue des déclarations
DATETIME vs TIMESTAMP
La déclaration XML : Personne.hbm.xml
Conclusion
2	www.proflibre.com
Introduction
L’objectif de cette formation est de savoir
comment créer une entité Hibernate avec
du XML.
3	www.proflibre.com
Prérequis
Ayant consulté les deux formations précédentes
dans la même série :
https://www.proflibre.com/?serie=55
[Hibernate] Vue d’ensemble
https://www.proflibre.com/JAVA_:_HIBERNATE/
[Hibernate]_Vue_d%E2%80%99ensemble/1
Hibernate Native : configurer
https://www.proflibre.com/JAVA_:_HIBERNATE/
Hibernate_Native_:_configurer/2
4	www.proflibre.com
Diagramme de classes
5	www.proflibre.com	
Personne	
-	id	:	Long	
-	nom	:	String	
-	prenom	:	String	
-	biographie	:	String	
-	age	:	int	
-	poids	:	Double	
-	compte	:	BigDecimal	
-	dateMariage	:	Date	
-	dateInser<on	:	Timestamp	
+	Ge?ers	&	Se?ers	
Diagramme	de	classes	«	UML	»	:
La classe JAVA
« Personne.java »
6	www.proflibre.com
Schéma relationnel
7	www.proflibre.com	
Schéma	rela?onnel	«	MLD	/	MySQL	»	de	la	table	«	Personne	»	qu’on	souhaite	générer	
automa?quement	avec	Hibernate	:
Structure minimale
du fichier *.hbm.xml
8	www.proflibre.com	
<hibernate-mapping	package="com.proflibre.xml">	
<class	name="Personne"	table="PERSONNE">												Nom	de	la	table	dans	la	BD	
<id	name="id"	column="personne_id">	
	<generator	class="iden>ty"/>																	Clé	primaire	
</id>		propriété	JAVA	et	nom	du	champ	dans	la	BD	
<property	name="nom"	type="org.hibernate.type.StringType"	
length="500"	/>					propriété	JAVA								Type	Hibernate	
…																																																																																																																								Autres	
<property	name="dateInser>on"	type=">mestamp">	
<column	name="date_inser>on"	sql-type="TIMESTAMP"	/>	
</property>	
	</class>	
</hibernate-mapping>									Nom	du	champ	dans	la	BD								Type	du	champ	dans	la	BD	
	
	
	
Package	JAVA	
Nom	de	la	classe	JAVA	
AUTO_INCREMENT	
Taille	du	
champ	
dans	la	
BD
Choisir le typage
9	www.proflibre.com	
Pour	faire	la	correspondance	entre	les	types	Hibernate,	JAVA	et	SGBD	(MySQL),	
rendez-vous	sur	la	documenta<on	officielle	(rubrique	2.3.	Basic	Types)	:	
h?ps://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/
Hibernate_User_Guide.html#basic	
	
Deux	déclara<ons	possibles	:	
	
1.	L’aYribut	“type”	de	la	balise	“property”	:	
	
<property	name="nom"	type="org.hibernate.type.StringType"	length="500"	/>	
	
L’aNribut	type	peut	prendre	comme	valeur	le	:	
Ø  Nom	d’un	type	Hibernate	:	Hibernate	type	(org.hibernate.type	package),	
exemple	:	org.hibernate.type.StringType	
Ø  Nom	d'une	classe	Java	:	Java	type,	exemple	:	java.lang.String	
Ø  Nom	d'un	type	basique	Hibernate	:	BasicTypeRegistry	key(s),	exemple	:	string.
Choisir le typage
10	www.proflibre.com	
2.	L’aYribut	“sql-type”	de	la	balise	“column”	:		
	
<property	name="dateInser>on"	type=">mestamp">	
	<column	name="date_inser>on"	sql-type="TIMESTAMP"	/>	
</property>	
	
L’a?ribut	sql-type	peut	prendre	comme	valeur	le	type	du	champ	dans	la	base	du	SGBD,	
ce	qui	correspond	à	la	colonne	JDBC	type	de	la	documenta<on	officielle,	exemple	:	
VARCHAR.	Pour	spécifier	la	taille	de	la	chaîne,	il	suffit	de	rajouter	l’a?ribut	length	à	la	
balise	column.
Remplir la fiche
préparatrice
11	www.proflibre.com	
Propriétés	
JAVA/Hibernate	
Types	JAVA	 Types	
Hibernate	
Champs	MySQL	 Types	MySQL	
id	 Long	 long	 personne_id	 bigint	
nom	 String	 org.hibernate.t
ype.StringType	
nom	 varchar	
prenom	 String	 java.lang.String	 prenom	 varchar	
biographie	 String	 text	 biographie	 longtext	
age	 int	 int	 age	 int	
poids	 Double	 double	 poids	 double	
compte	 BigDecimal	 big_decimal	 compte	 decimal	
dateMariage	 Date	 date	 dateMariage	 date	
dateInser<on	 Timestamp	 ?mestamp	 date_inser<on	 ?mestamp
La clé primaire
12	www.proflibre.com	
	
Plusieurs	valeurs	sont	possibles	pour	l’a?ribut	class	de	la	balise	generator	:	
	
Ø  iden?ty	:	l'iden<fiant	renvoyé	est	de	type	long,	short	ou	int,	c’est	l’équivalent	d’une	
clé	primaire	AUTO_INCREMENT	pour	MySQL.	
Ø  na?ve	:		choisit	iden<ty,	sequence	ou	hilo	selon	les	possibilités	offertes	par	la	base	
de	données	sous-jacente,	c’est	l’équivalent	d’une	clé	primaire	AUTO_INCREMENT	
pour	MySQL.	
Ø  Increment	:	ne	pas	u<liser	en	environnement	clusterisé.	Ce	n’est	pas	l’équivalent	
d’une	clé	primaire	AUTO_INCREMENT	pour	MySQL,	l’incrémenta<on	est	gérée	ici	
par	Hibernate	et	non	par	le	SGBD.	
Ø  assigned	:	laisse	l'applica<on	affecter	un	iden<fiant	à	l'objet	avant	que	la	méthode	
save()	soit	appelée.	Il	s'agit	de	la	stratégie	par	défaut	si	aucun	<generator>	n'est	
spécifié.	
Ø  	Sequence	:		u<lisa<on	des	séquences	dans	DB2,	PostgreSQL,	Oracle,	SAP	DB,	McKoi	
ou	d'un	générateur	dans	Interbase.	L'iden<fiant	renvoyé	est	de	type	long,	short	ou	
int.	Les	séquences	sont	très	u<lisées	sur	Oracle.	
Ø  …
Catalogue des déclarations
13	www.proflibre.com	
Pour	plus	d’informa>ons	sur	la	structure,	visitez	les	rubriques	5.1.3.	class,	5.1.4.	id,	
5.1.4.1.	Generator,	5.1.11.	property	et	5.1.22.	éléments	column	et	formula	de	
l’ancienne	documenta>on	officielle	pour	XML	:	
hNps://docs.jboss.org/hibernate/stable/core.old/reference/fr/html/mapping.html
DATETIME vs TIMESTAMP ?
14	www.proflibre.com	
Les	types	DATETIME	et	TIMESTAMP	sont	tous	les	deux	u<lisés	pour	les	
valeurs	qui	con<ennent	des	par<es	de	date	et	d'heure.	MySQL	les	récupère	
et	les	affiche	au	format		'YYYY-MM-DD	hh:mm:ss'	format.	
	
DATETIME	est	définie	dans	l’inervalle	'1000-01-01	00:00:00’	à	'9999-12-31	
23:59:59'.	
	
TIMESTAMP	est	définie	dans	l’inervalle	'1970-01-01	00:00:01'	UTC	à	
'2038-01-19	03:14:07'	UTC.	
	
MySQL	conver<t	les	valeurs	TIMESTAMP	du	fuseau	horaire	actuel	en	UTC	
pour	le	stockage,	et	de	retour	de	l'UTC	vers	le	fuseau	horaire	actuel	pour	la	
récupéra<on.	(Cela	ne	se	produit	pas	pour	d'autres	types	tels	que	
DATETIME.)	Par	défaut,	le	fuseau	horaire	actuel	pour	chaque	connexion	est	
l'heure	du	serveur.	
	
Source	:	h?ps://dev.mysql.com/doc/refman/8.0/en/date<me.html
DATETIME vs TIMESTAMP ?
15	www.proflibre.com	
Ø  Créer	un	champ	de	type	MySQL	TIMESTAMP	avec	Hibernate	:	
Ø  Créer	un	champ	de	type	MySQL	DATETIME	avec	Hibernate	:
La déclaration XML
« Personne.hbm.xml »
16	www.proflibre.com	
Nombre	total	de	chiffres	
Nombre	de	chiffres	après	la	virgule	
Nom	du	champ	dans	la	base	
Nom	de	la	propriété	dans	la	classe	JAVA
Conclusion
Dans l’étape suivante, nous allons découvrir
comment créer la même entité vue dans
cette formation avec les annotations.
17	www.proflibre.com
www.proflibre.com	 18	
Merci de votre attention.
Vous pouvez poser des questions ou laisser des
remarques dans la zone des commentaires sur la
page de cette formation. D’autres formations qui
pourront vous intéresser sont publiées sur
ProfLibre.com régulièrement.
Vous pouvez aussi passer le Quizz sur la même
page pour tester vos connaissances. Et n’oubliez
pas de vous abonner à notre chaîne Youtube et
partager avec vos collègues.
A très bientôt !
L’équipe ProfLibre.com
www.proflibre.com	 19	www.proflibre.com

Hibernate : comment déclarer une entité XML