Ouvrir une session

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à toutes et tous,

Je commence un nouveau projet en Java, langage que j'ai appris à l'école il y a plusieurs années et n'ai jamais pratiquer. Je souhaite m'attaquer à la "base de données" et j'éprouve quelques difficultés de compréhension.

Je suis développeur php et je suis habitué à Doctrine.
Pour moi Doctrine c'est juste le meilleur de ce que j'ai pu voir, on écris des classes modèles avec les bonnes annotations. Une simple ligne de commande pour synchroniser la structure de la base de données avec le modèle de l'application et nous voilà prêt à utiliser la base de données de manière transparente.

Je me suis dit qu'un langage tel que Java devait forcément proposer des mécanismes/framework proposant ce genre de fonctionnalités, cependant ce fut nettement moins évident à trouver que je ne l'avait imaginer.

J'ai trouver Hibernate qui devrai normalement permettre de genre de fonctionnalité, au départ j'étais dérouté car le mappage se faisait dans des fichiers xml ce que je trouvais extrêmement lourd. Cependant avec mes recherches j'ai finalement compris que cela datait d'avant Java 1.5 (nous sommes aujourd'hui à Java 1.8).

L'installation d'Hibernate n'a pas non plus été aussi simple que j'aurai pu le croire (un mode d'emploi sur leur site n'aurai pas été du luxe).

Ok, maintenant Hibernate est associé à mon projet de même qu'un connecteur mysql. J'ai réussi à écrire un classe User en précisant des annotations (de nouveau, dans les exemples on vois @Entity puis quand on le tape on voit que c'est déprécié, faut de nouveau fouillé le web pour savoir que c'est @DynamicUpdate qu'il faut utiliser).
J'ai créé un fichier de configuration en spécifiant les paramètres de ma base de données, reste plus qu'a se connecter à la base de données et de synchroniser le schéma…

Problème, je ne trouve absolument aucun tutoriel expliquant ce qu'il faut faire. Je pioche des informations par-ci par là sur le net et je ne fait qu'avancer dans le brouillard complet.

Je suis actuellement bloquer à comment ouvrir une session, mais lorsque je cherche des informations je tombe systématiquement sur "dans votre serveur TomCat", sauf que c'est pas mon but, moi je veux faire une application distribuée.

Bref, soit je me trompe complètement, il faut absolument un serveur du coup je me plante de technologie. Soit sa existe mais les informations sont hyper dure à trouver.

Quelqu'un ne pourrai pas m'indiquer un tutoriel complet et récent à ce sujet ? Mon but n'est ni plus ni moins que d'avoir un ORM capable de synchroniser une base de données.

Merci d'avance pour votre aide.
Cordialement, La source.

Édité par La source

+0 -0

Hello :)

Non il ne faut pas un serveur.

Un truc à savoir c'est qu'Hibernate est à l'origine de ce qu'on appelle aujourd'hui JPA (c'est devenu un truc normalisé, avec une spec et tout). Aujourd'hui, donc, Hibernate est une implémentation de JPA (comme il en existe d'autre). Ca peut peut-être aider à trouver plus d'infos.

Pour le @Entity, je crois pas que ce soit déprécié : http://docs.jboss.org/hibernate/jpa/2.1/api/ c'est toujours dans JPA 2.1. Et la doc d'Hibernate 5.0 : http://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#entity-pojo-mapping l'utilise également. Et je dirais même que @DynamicUpdate fait autre chose que @Entity, non ?

Pour ce qui est du démarrage d'Hibernate, faut regarder par là : http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#bootstrap-native . A partir d'une persistent-unit (correspondant à une schéma SQL le plus souvent j'ai l'impression), tu vas créer un EntityManagerFactory dont tu vas te servir à chaque fois que tu as besoin d'une nouvelle session (EntityManager).

Le truc c'est qu'Hibernate est plus qu'un simple mapping objet-relationnel (ça me paraissait naturel mais en fait c'est en regardant l'ORM de Django que j'en ai pris en conscience). (mise en cache, etc.). Du coup tu as effectivement besoin de définir un contexte d'utilisation de l'EntityManager. Le plus souvent, on l'associe au thread dans lequel on se trouve (ThreadLocal en java). Dans un conteneur d'application "standard" Java EE comme Tomcat, comme on a un thread par requête HTTP, grosso modo on dit : "bon bah à chaque requête qui te parvient, ouvre une nouvelle session, travaille dedans, puis ferme la session à la fin". (ce qui est horriblement coûteux en termes de ressources).

Dans ton cas il va donc falloir trouver quelle est la durée de ta session, et à quoi elle est attachée.

Mais vraiment, pour bien comprendre Hibernate faut lire (en entier, même si ça part sur du XML au début, les annotations c'est juste du sucre bien pratique, les concepts sont les mêmes) la doc de JBoss plutôt que des tutoriels ultra spécifiques sur Tomcat + Hibernate + machin + bidule.

Qu'est-ce-que tu utilises pour faire ton application distribuée ? Parce que ça me semble mal se marier avec Hibernate / JPA du coup :\

Édité par Javier

Happiness is a warm puppy

+0 -0
Staff

L'installation d'Hibernate n'a pas non plus été aussi simple que j'aurai pu le croire (un mode d'emploi sur leur site n'aurai pas été du luxe).

quand on fait du java et qu'on commence à avoir des dépendances, on utilise maven ou graddle. Et là c'est très facile d'installer.

Je suis actuellement bloquer à comment ouvrir une session, mais lorsque je cherche des informations je tombe systématiquement sur "dans votre serveur TomCat", sauf que c'est pas mon but, moi je veux faire une application distribuée.

bah si tu veux ouvrir une session, c'est que tu veux faire une application client/serveur non?

Si tu ne veux pas de serveur, tu ne veux pas de session.

Édité par artragis

+0 -0
Auteur du sujet

Pour le @Entity, je crois pas que ce soit déprécié : http://docs.jboss.org/hibernate/jpa/2.1/api/ c'est toujours dans JPA 2.1. Et la doc d'Hibernate 5.0 : http://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#entity-pojo-mapping l'utilise également. Et je dirais même que @DynamicUpdate fait autre chose que @Entity, non ?

Javier

C'est exactement pour sa que j'ai un soucis avec cette doc (et par opposition que j'adore les tutos sur ce site) c'est qu'il n'y a pas tout. Je ne vois nul par mention des imports dans les exemples de code, du coup bah, j'ai bêtement regardé ce qu'eclipse me proposait.
Pour l'annotation il m'avait proposer d'importer import org.hibernate.annotations.*; et c'est là que j'ai eu mon Warning. Par contre si on importe javax.persistence.* là sa va nettement mieux. Par contre j'avoue maintenant que je relis ils en parle dans le texte autour du code exemple, je m'étais concentré sur les exemple de code uniquement.

En suivant la page de "bootstrap", j'ai finalement écris une vingtaine de ligne de code et je me retrouve avec une erreur lorsque je tente d’exécuter :( Je trouve sa horriblement compliquer d'ouvrir une simple connexion à la base de données.

Java je ne le maîtrise pas, je sais l'objectif auquel je souhaite arrivé, et je me dit que c'est un très bon exercice. Assez simplement je souhaite faire un CRM, il faut évidement une base de données pour stocker les informations, il faut donc en Java se connecter à la base de données, qu'elle soie en SQLite, MySQL ou PostgreSQL cela ne change finalement rien au problème.

Si le programme est mis à jour, la base de données locale devra également être mise à jour. D'où mon intérêt pour un système le mettant à jour automatiquement.

Pour répondre à la question… la session est attachée à l’exécution du programme, le temps que le programme tourne il doit être connecté à la base de données.

quand on fait du java et qu'on commence à avoir des dépendances, on utilise maven ou graddle. Et là c'est très facile d'installer.

artragis

Je ne connaissais pas, sa m'a l'air vachement pratique, je vais utilisé sa :)

bah si tu veux ouvrir une session, c'est que tu veux faire une application client/serveur non?

Si tu ne veux pas de serveur, tu ne veux pas de session.

artragis

Ben non… concrètement le programme peu être connecté à une base de données locale où il est seul à se connecté dessus. Où dans le cas qui m'intéresse, il peu y avoir plusieurs ordinateurs dans un même réseau local qui utilise la même base de données.

+0 -0
Staff

Ben non… concrètement le programme peu être connecté à une base de données locale où il est seul à se connecté dessus. Où dans le cas qui m'intéresse, il peu y avoir plusieurs ordinateurs dans un même réseau local qui utilise la même base de données.

SOit, mais du coup on n'est pas en mode "session" tel que le ferait un modèle client/serveur.

+0 -0
Auteur du sujet

Certes. ^^

Du coup comment ouvrir une connexion à une base de données avec Hibernate dans mon cas ?
Là tout de suite je ne peux pas vous donner le code que j'ai écris vu qu'il est à la maison, cependant il est inopérant de toute façon.

+0 -0

Je comprends pas du tout de quelle notion de session vous parlez, et encore moins du rapport avec la session HTTP, ou la session client serveur, etc.

Donc pour répondre à artragis, qu'il s'agisse de client/serveur ou de n'importe quoi : travailler avec Hibernate nécessite une session hibernate. C'est le point d'entrée à l'API. Donc je ne comprends toujours pas la phrase "si tu n'as pas besoin de serveur tu n'as pas besoin de session". Session au sens Hibernate c'est un EntityManager (au sens JPA).

Une session au sens Hibernate n'est pas (tout à fait) une connexion à la base de données. C'est une forme de transaction logique (c'est pas moi qui le dit, c'est la doc), isolée, et qui encapsule potentiellement plusieurs transactions SQL. Elle englobe notamment une connexion à la base de données, mais pas que. Je t'engage à lire ça.

Pour savoir "comment ouvrir une connexion" dans ton cas ce n'est pas évident. Et c'est pour ça que je te demandais quelle pouvait être sa durée de vie. Une question sous-jacente : est-ce-que ton application sera multi-threadée ?

On peut imaginer en première approche un cas simple dans lequel la session est directement liée à l'application. Donc une seule session, et basta. Donc tu démarres l'application, tu crées l'EntityManagerFactory puis un EntityManager (la session, donc) et tu travailles uniquement dans cette session. Ca peut fonctionner, attention lorsque ton application deviendra plus importante. C'est expliqué ici. A mon avis sur cette approche dans un premier temps, au moins pour te familiariser avec Hibernate.

Donc pour l'instant pour ne pas te prendre la tête : une seule connexion à la BDD, un seul EntityManager pour toute la durée de vie de l'application.

Pour le reste : ne te contente surtout pas de lire les bouts de code de la doc, il y a des concepts à vraiment appréhender (l'état des objets notamment : persistent, transient, detached). Faut vraiment lire à fond.

Après, tu as décidé d'attaquer par un énorme morceau d'un coup. La plupart des gens démarrent avec JDBC puis montent d'un cran avec Hibernate. Là c'est normal que tu aies l'impression que tout est extrêmement compliqué (et Hibernate est extrêmement compliqué, c'est vrai). Prends le temps de te poser et lire la doc calmement, et essayer de comprendre les concepts de base (Connection, connection pool, EntityManager et EntityManagerFactory, cycle de vie des objets, rattachement / détachement d'objets à l'entity manager, lazy loading, etc.) et montre-nous ton erreur aussi, ça nous aidera à t'aiguiller.

EDIT : et tu devrais certainement changer le titre de ton message pour avoir plus de réponses.

Édité par Javier

Happiness is a warm puppy

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte