
La FAQ HibernateConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 63, dernière mise à jour : 5 juin 2009
Sommaire→Divers→Exceptions- Comment résoudre l'erreur HQL : « net.sf.hibernate.QueryException: undefined alias » ?
- Pourquoi est-ce que j'obtiens une erreur lorsque j'utilise un type primitif dans mon javabean ?
- Que faire en cas de : IllegalArgumentException: Removing a detached instance ?
- Pourquoi est-ce qu'Hibernate ne fonctionne pas avec toute les version de MySql ?
- Que faire si je vois le log : Parsing XML: unknown system id ?
- Pourquoi est-ce que j'obtiens une OutOfMemory lors de l'insertion de beaucoup d'objets ?
Un alias de classe doit être créé. Contrairement au SQL, le HQL impose la plupart du temps d'utiliser des alias des objets sur lesquels on travaille pour en manipuler leurs membres.
SELECT produits.reference,produits.titre FROM stock.Produits produits WHERE produits.prix > 50
Tout simplement, parce qu'il ne faut pas employer des types primitifs, Hibernate n'acceptant que les types Serializable. Il vous faut employer des types sérializables, Integer par exemple. C'est pareil pour boolean, double, long, …. Il vous faut toujours employer un type qui soit sérializable.
Cela veut dire que l'objet n'est plus attaché à la session Hibernate. Il vous faut donc le rattacher à la session.
Pour cela, vous pouvez consulter la question qui en parle.
Lien : Comment attacher un objet détaché à une session ?
Lien : Qu'est ce qu'un objet détaché ?
Certaines versions de Mysql ne fonctionnent pas correctement avec les preparedStatement. Il faut donc désactiver les preparedStatement.
Pour cela, il vous faut ajouter useServerPrepStmts=false à l'url de connexion à votre base de données.
Rien du tout, cette erreur est tout à fait normale lors du chargement des ressources.
Tout simplement parce qu'Hibernate va devoir stocker tout vos objets dans le cache et que cela va demander énormément de mémoire si vous avez beaucoup d'objet.
Comment y remédier ? Il faut procéder à une insertion par paquet. C'est-à-dire que tous les 20 (taille d'un paquet JDBC, mais vous pouvez mettre autre chose) insertions, il faut faire un flush de la session et un clear du cache :
for(int index = 0 ; index < 100000 ; index++){
Od objet = new Od(/* Paramètres divers */);
session.save(objet);
if(index % 20 == 0){
session.flush();
session.clear();
}
}
Ainsi vous aurez des petits paquets et un risque quasi nul de dépassement mémoire.


















