IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

[Hibernate] Question de savoir faire


Sujet :

Développement Web en Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Points : 49
    Points
    49
    Par défaut [Hibernate] Question de savoir faire
    Bonjour,

    J'ai la volonté de me faire une application pour visualiser ma médiathèque.

    Pour l'instant je vois ça petit, c'est-à-dire que ma priorité et d'avoir un programme java qui parcourt un répertoire donné afin de récupérer les informations des médias et de les stocker en base.

    Par la suite je ne sais pas encore si je souhaite faire quelque chose de tout simple en php pour visualiser la médiathèque ou alors quelque chose de plus abouti.

    Et c'est là que vous intervenez .
    Sur quoi dois je me baser pour commencer à travailler ? Partir sur du Spring ou autre framework ?

    Rester en hibernate/JPA/JTA sans plus ?

    Je pense que la seconde option est la plus adaptée à mon besoin cependant en commencant à travailler dessus il y a une chose qui me déplaîs. Il semble obligatoire de gérer manuellement et par des fichiers de configuration les entités.
    Est-ce que je me trompe ?

    Car actuellement lorsque j'essaye d'enregistrer en base je récupère l'erreur unknown entity.

    En effectuant des recherches il semble obligatoire de configurer un fichier xml pour mapper la classe + ses propriétés ce que je trouve assez moche...

    Auriez vous une solution plus propre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    Film f = getFilmById(1L);
    f.setLibelle("test - " + f.getLibelle());
    session.save(f);
    tx.commit();
    session.close();

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Le mapping est effectivement obligatoire (Hibernate a besoin de savoir quel champ de quelle entité correspond à quel champ de la base de données).

    En revanche, le mapping XML n'est pas la seule solution. Il peut être remplacé par des annotations dans tes classes d'entités :
    • La classe doit être annoté @Entity
    • La classe doit avoir une annotation @Table indiquant dans quelle table l'entité est mappée
    • Les champs doivent être annotés @Column pour préciser la colonne de correspondance
    • Les jointures sont représentées par les annotations @OneToMany, @ManyToMany
    • Etc. Tu trouveras plus d'informations sur ces mappings dans les tutoriels Hibernate du site


    Enfin, tu n'es pas obligé de créer le mapping (XML ou classes java) manuellement. Il existe plusieurs outils (Hibernate Tools, etc.) qui peuvent faire du reverse engineering de ta base de données pour créer ces mappings (charge à toi ensuite de les maintenir au fil des évolutions).
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Merci pour ces précisions.
    J'avais donc bien compris le fonctionnement des annotations .

    Donc où peut se situer le problème car mon entité est correctement annotée (enfin il me semble).

    Autre question: suis-je obligé de gérer moi même les transactions comme au vu de mon premier post ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    package com.mediatheque.entity;
     
    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;
     
    /**
     *
     * @author steeve
     */
    @Entity
    @Table(name = "film")
    @NamedQueries({
        @NamedQuery(name = Film.FIND_ALL, query = "SELECT f FROM Film f"),
        @NamedQuery(name = Film.FIND_BY_ID, query = "SELECT f FROM Film f WHERE f.id = :id"),
        @NamedQuery(name = Film.FIND_BY_LIBELLE, query = "SELECT f FROM Film f WHERE f.libelle = :libelle")})
    public class Film implements Serializable {
     
        private static final long serialVersionUID = 3207934653898866506L;
     
        public static final String FIND_ALL = "Film.findAll";
        public static final String FIND_BY_ID = "Film.findById";
        public static final String FIND_BY_LIBELLE = "Film.findByLibelle";
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID")
        private Long id;
     
        @Column(name = "LIBELLE", nullable = false)
        private String libelle;
     
        public Film() {
        }
     
        public Long getId() {
            return id;
        }
     
        public void setId(Long id) {
            this.id = id;
        }
     
        public String getLibelle() {
            return libelle;
        }
     
        public void setLibelle(String libelle) {
            this.libelle = libelle;
        }
     
        @Override
        public String toString() {
            return "Film[ id=" + id + ", libelle=" + libelle + " ]";
        }
     
    }
    Mon fichier persistence.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <persistence version="1.0"
        xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
     
        <persistence-unit name="Mediatheque-PU" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
     
            <properties>
                <property name="hibernate.archive.autodetection" value="class" />
                <!--<property name="hibernate.show_sql" value="true" />--> 
                <property name="hibernate.format_sql" value="true" />
     
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/mediatheque" />
                <property name="hibernate.connection.username" value="root" />
                <property name="hibernate.connection.password" value="root" />
     
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
     
            </properties>
     
        </persistence-unit>
    </persistence>

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    J'ai réussi à faire fonctionner le save mais la solution ne me plaît pas trop .

    Voici mon arborescence


    Mon fichier hibernate.cfg.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
      <session-factory>
        <property name="hibernate.archive.autodetection">class</property>
        <!--<property name="hibernate.show_sql" value="true" />--> 
        <property name="hibernate.format_sql">true</property>
     
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mediatheque</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
     
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     
        <mapping class="com.mediatheque.entity.Film" />
      </session-factory>
    </hibernate-configuration>
    Mon fichier de persistence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <persistence version="1.0"
        xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
     
        <persistence-unit name="Mediatheque-PU" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
     
            <properties>
                <property name="hibernate.archive.autodetection" value="class" />
                <!--<property name="hibernate.show_sql" value="true" />--> 
                <property name="hibernate.format_sql" value="true" />
     
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/mediatheque" />
                <property name="hibernate.connection.username" value="root" />
                <property name="hibernate.connection.password" value="root" />
     
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
     
            </properties>
     
        </persistence-unit>
    </persistence>
    ça me dérange un peu d'avoir deux fichier de configuration pratiquement identique...

    De plus apparemment je suis obligé de déclarer toutes mes entités dans le fichier de configuration d'hibernate ou alors je m'y prend mal ?

Discussions similaires

  1. [HIBERNATE] question concernant le mapping
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 10
    Dernier message: 19/05/2006, 12h55
  2. Réponses: 3
    Dernier message: 13/05/2006, 11h06
  3. [ HIBERNATE ] Question pour les doués
    Par Néo-Tony dans le forum Hibernate
    Réponses: 25
    Dernier message: 23/02/2006, 15h23
  4. [Hibernate]Question sur Hibernate
    Par elhani dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/12/2005, 15h39
  5. Question de débutant : Faire une puissance en c++
    Par Spartan03 dans le forum C++
    Réponses: 1
    Dernier message: 15/09/2005, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo