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

Hibernate Java Discussion :

Hibernate 4 et SessionFactory


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut Hibernate 4 et SessionFactory
    Bonjour à tous et à toutes,

    J'ai crée un test JUnit permettant de tester l'ajout en Base d'une entitée. J'utilise Hibernate-core en version 4 déclaré dans un fichier pom.xml.
    Voici mon code :
    Code Java : 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
     
    public class TacheTest {
     
    	private final static Logger logger = LogManager.getLogger(MainTacheApplication.class.getName());
    	private static SessionFactory maSessionFactory;
    	private static ServiceRegistry serviceRegistry;
     
    	static {
    		try {
    			Configuration configuration = new Configuration();
    			configuration.configure();
     
    			serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    			maSessionFactory = configuration.buildSessionFactory(serviceRegistry);
    		} catch(Throwable ex) {
    			throw new ExceptionInInitializerError(ex);
    		}
    	}
     
    	public static Session getSession() throws HibernateException {
            return maSessionFactory.openSession();
        }
     
    	@Test
    	public void testCreateEntity() throws SQLException {
    		Transaction transaction = getSession().beginTransaction();
     
    		// Instanciation de la tâche
    		Tache maTache = new Tache();
    		logger.info("Trying to create a test connection with the database.");
    		maTache.setDescription("maPremiereTache");
    		maTache.setDateDeCreation(new Date());
    		// l'objet est en session pour être manipulé
    		getSession().save(maTache);		
    		transaction.commit();
     
    		Assert.assertNotNull(maTache.getIdTache()); // on vérifie l'assertion
     
    	}
    }

    Lors de l'éxécution du test, j'ai le message suivant dans le Console.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    2013-12-30 11:38:31,226 INFO  [main] common.Version (Version.java:37) | Hibernate Commons Annotations 3.2.0.Final
    déc. 30, 2013 11:38:31 AM org.hibernate.Version logVersion
    INFO: HHH000412: Hibernate Core {4.2.3.Final}
    déc. 30, 2013 11:38:31 AM org.hibernate.cfg.Environment <clinit>
    INFO: HHH000205: Loaded properties from resource hibernate.properties: {hibernate.connection.username="postgres", hibernate.connection.password=****, hibernate.dialect="org.hibernate.dialect.PostgreSQLDialect", hibernate.show_sql=true, hibernate.connection.url="jdbc:postgresql://localhost:5432/tacheapp", hibernate.bytecode.use_reflection_optimizer=false, hibernate.connection.driver_class="org.postgresql.Driver", hibernate.format_sql=true}
    déc. 30, 2013 11:38:31 AM org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: HHH000021: Bytecode provider name : javassist
    Merci d'avance.
    Transact.

  2. #2
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Voici l'erreur retournée par JUnit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Caused by:java.lang.NoClassDefFoundError: org/hibernate/util/DTDEntityResolver

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Il faut que tu donnes la stack complète de l'erreur pour qu'on te dise d'où elle vient. Tu utilises probablement un framework qui a une dépendance vers Hibernate 3, alors que tu utilises Hibernate 4. Ou alors des versions d'Hibernate différentes (du genre hibernate-annotation en version 3 avec hibernate-entitymanager en version 4).

    Romain.

  4. #4
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Dans un premier temps merci pour ta réponse.
    Entre-temps, j'ai modifié dans le Maven les versions des artifactId de hibernate-core et hibernate-entity, et c'est beaucoup mieux (même si mon test reste en rouge!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <!-- HIBERNATE -->
    		<dependency>
    			<groupId>org.hibernate</groupId>
    			<artifactId>hibernate-core</artifactId>
    			<version>4.2.8.Final</version>
    		</dependency>
    		<dependency>
    			<groupId>org.hibernate</groupId>
    			<artifactId>hibernate-entitymanager</artifactId>
    			<version>4.2.8.Final</version>
    		</dependency>
    Par contre le problème vient d'ailleurs, en effet la stackTrace de JUnit me dit ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ids for this class must be manually assigned before calling save()
    En effet la colonne idTache de table Tache est un type serial sous PostgreSQL.
    L'insertion dans le jeu de test doit "probablement" se faire manuellement.

  5. #5
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    J'avance pas à pas, mon test est passé au vert.
    Dans le code du test il fallait initialiser l'identifiant de la tâche puisque le type est un serial (il n'est pas auto-incrémenté).

    Par contre la tâche n'est pas insérée en Base de données.

    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
     
    public class TacheTest {
     
    	private final static Logger logger = LogManager.getLogger(TacheTest.class.getName());
     
    	@Test
    	public void testCreateEntity() throws SQLException {
    		Transaction transaction = getSession().beginTransaction();
     
    		// Instanciation de la tâche
    		Tache maTache = new Tache();		
    		maTache.setDescription("maPremiereTache");
    		maTache.setDateDeCreation(new Date());
    		// Initialiser l'identifiant de l'entité avant de l'insérer en Base
    		maTache.setIdTache(1);
    		// L'objet est en session pour être manipulé		
    		getSession().save(maTache);	
    		logger.info("La tâche a été ajoutée avec succès !");
    		transaction.commit();		
    		Assert.assertNotNull(maTache.getIdTache()); // on vérifie l'assertion
    		getSession().close();		
    	}

  6. #6
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    ... et c'est normal qu'elle ne soit pas insérée en Base puisque je passe par l'implémentation d'une interface DAO pour effectuer mon CRUD.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Les test unitaires sont rollbackés par défaut…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Test
    @Rollback(false)
    si vous voulez réellement persister…

    mais auquel cas il faut aussi du code de "nettoyage" des données insérées/modifiées par les tests unitaires pour repartir toujours du même état connu (et éviter des erreurs du genre "non unique primary key" lors d'une deuxième exécution…).

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Si tu ne souhaites pas spécifier d'id "à la main" ( maTache.setIdTache(1); ) il te faut utiliser un "generator" (au sens Hibernate) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Id
    @Column(name = "your_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer yourId;
    Si tu génères le schéma par hibernate il te faudra rajouter que le type est "serial":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Id
    @Column(name = "your_id", columnDefinition = "serial")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer yourId;
    Si ça marche pas, cherche "hibernate 4 postgresql serial" sur Internet tu devrais trouver de l'aide.

    Romain.

  9. #9
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Il faut tout de même initialiser l'identifiant de l'entité ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Data] hibernate et multiple sessionFactory
    Par bgerin dans le forum Spring
    Réponses: 2
    Dernier message: 13/02/2010, 12h01
  2. [Data] [Hibernate] Initialisation de la "sessionFactory"
    Par FreshVic dans le forum Spring
    Réponses: 1
    Dernier message: 02/10/2008, 11h47
  3. Réponses: 8
    Dernier message: 17/04/2008, 17h29
  4. Hibernate pb SessionFactory
    Par dominou73 dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/08/2007, 12h17
  5. [Hibernate] probleme de SessionFactory
    Par Elmilouse dans le forum Hibernate
    Réponses: 2
    Dernier message: 11/04/2006, 16h52

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