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 :

problèmes avec la stratégie : une table par classe fille


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 110
    Points : 91
    Points
    91
    Par défaut problèmes avec la stratégie : une table par classe fille
    Bonjour,

    Depuis peu, je me suis mis à apprendre hibernate avec comme support, la doc officiel. Je suis arrivé à la gestion de l'heritage et j'ai voulu tester une des stratégie.

    De ce fait j'ai développé un petit soft pour experimenter cela. Donc j'ai créer une classe personne et 2 classes (Indep & Salarie) qui hérite de celle-ci et pour pimenter ça j'ai créer 2 autres classes (email & tel) qui j'intégre au classes héritées comme components mais je rencontre une exception lorsque je veux exécuter l'application.

    Initial SessionFactory creation failed. org.hibernate.MappingException: invalid configuration
    java.lang.NullPointerException
    at hr.HrManager.createAndStoreSal(HrManager.java:49)
    at hr.HrManager.main(HrManager.java:15)
    java.lang.NullPointerException
    at hr.HrManager.createAndStoreFree(HrManager.java:22)
    at hr.HrManager.main(HrManager.java:16)
    je sais que c'est farfelu mais mon but etait de mélanger divers points...

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package hr;
     
    public class Personne {
     
    	public Personne(){}
     
    	protected Long id;
    	protected String name;
    	protected String lastname;
    	protected String addr;
    	protected String year;
    	protected Tel tel;
    	protected Email email;
     ... les accesseurs ...
    voici son mappage :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="hr">
    	<class name="Personne" table="people">
     
    		<id name="id" column="id">
    			<generator class="native"/>
    		</id>
     
    		<property name="addr" />
    		<property name="name" />
    		<property name="lastname" />
    		<property name="year"/>
     
    		<!-- les objets : Email, Tel-->
     
    		<component name="email" class="Email">
    			<property name="eAddr" />
    		</component>
     
    		<component name="tel" class="Tel">
    			<property name="country" />
    			<property name="number"/>
    			<property name="prefix" />
    		</component>
     
    		<joined-subclass name="Indep" table="Freelance">
    			<key column="id"/>
    			<property name="company"/>
    		</joined-subclass>
     
    		<joined-subclass name="Salarie" table="Employe">
    			<key column="id"/>
    			<property name="dept"/>
    			<property name="fct"/>
    		</joined-subclass>
     
    	</class>
     
    </hibernate-mapping>
    voici les classes héritées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package hr;
     
    public class Indep extends Personne {
    	public Indep(){}
     
    	private String company;
     
    	... accesseur ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package hr;
     
    public class Salarie extends Personne{
    	public Salarie(){}
     
    	private String dept;
    	private String fct;
     
    ... accesseurs ...
    }
    le reste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package hr;
     
    public class Email {
    	public Email(){}
     
    	private String eAddr;
     
    	... accesseur
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package hr;
     
    public class Tel {
    	public Tel(){}
     
    	private String number;
    	private String country;
    	private String prefix;
     
    	... accesseurs ...
    }
    Ma classe hibernateUtil :

    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
    package util;
     
    import org.hibernate.*;
    import org.hibernate.cfg.*;
     
    public class HibernateUtil {
     
    	private static SessionFactory sessionFactory;
     
    	static{
    		try{
    			//create the SessionFactory from hibernate.cfg.xml
    			//methode 1 : la plus courante
     
    			sessionFactory=new Configuration().configure().buildSessionFactory();
     
     
    			//methode 2
    			/*sessionFactory=(SessionFactory) new Configuration()
    				.setNamingStrategy(DefaultNamingStrategy.INSTANCE)
    				.addFile("Event.hbm.xml")
    				.addFile("Person.hbm.xml")
    				.buildSessionFactory();*/
     
    			//methode 3 tourne
    			//sessionFactory=new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
     
    			//methode 4 ne fonctionne pas pq ? Aucune idée mais je pense qu'il manque des paramètres 
    			//sessionFactory=(SessionFactory)new Configuration().addResource("events/Event.hbm.xml").addResource("events/Person.hbm.xml").buildSessionFactory();
     
    		}
    		catch(Throwable ex){
    			//Make sure you log the exception, as it might be swallowed
    			System.err.println("Initial SessionFactory creation failed. "+ex);
    			//throw new ExceptionInInitializerError(ex);
    		}
    	}
    	public static SessionFactory getSessionFactory(){
    		return sessionFactory;
    	}
    }
    Le fichier de config :

    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
    <?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>
     
    		<!-- DB CONNECTION SETTINGS -->
     
    			<property name="connection.driver_class">org.postgresql.Driver</property>
    			<property name="connection.url">jdbc:postgresql://localhost/test</property>
    			<property name="connection.username">Manu</property>
    			<property name="connection.password">manu</property>
     
    		<!-- JDBC connection pool -->
     
    			<property name="connection.pool_size">1</property>
     
    		<!-- SQL DIALECT -->
     
    			<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
     
    		<!-- ENABLE HIBERNATE'S AUTOMATIC SESSION CONTEXT MANAGEMENT -->
     
    			<property name="current_session_context_class">thread</property>
     
    		<!-- DISABLE THE SECOND-LEVEL CACHE -->
     
    			<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
     
    		<!-- ECHO ALL EXECUTED SQL TO STDOUT -->
     
    			<property name="show_sql">true</property>
     
    		<!-- DROP AND RE-CREATE THE DB SCHEMA ON STARTUP -->
     
    			<property name="hbm2ddl.auto">create</property>
     
    		<!-- MAPPING -->
     
    			<!-- gestion evenements voir packages events-->
     
    			<!--<mapping resource="events/Event.hbm.xml"/>
    			<mapping resource="events/Person.hbm.xml"/>-->
     
    			<!-- gestion piece auto voir packages cars -->
     
    			<!--<mapping resource="cars/auto.hbm.xml"/>
    			<mapping resource="cars/composant.hbm.xml"/>-->
     
    			<!-- gestion HR voir pakages hr -->
     
    			<maping resource="hr/Personne.hbm.xml"/>
     
    	</session-factory>
     
    </hibernate-configuration>
    et voici mon objet contenant mon main :

    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
    65
    66
    67
    68
    package hr;
    import org.hibernate.Session;
    import util.HibernateUtil;
     
    public class HrManager {
     
    	public static void main(String[] args) {
    		HrManager hrm=new HrManager();
    		Long idEmp=hrm.createAndStoreSal();
    		Long idFre=hrm.createAndStoreFree();
    	}
    	public Long createAndStoreFree(){
    		Session session=null;
    		Indep freel=new Indep();
    		try{
    			session=HibernateUtil.getSessionFactory().getCurrentSession();
    			System.out.println("SAISIE DONNEE FREEL : ");
    			freel.setAddr("Av road drive 12A 90210 Beverly Hills");
    			freel.setCompany("SoftWear Factory");
    			Email box=new Email();
    			box.setEAddr("CEO@SoftWearFactory.us");
    			freel.setEmail(box);
    			freel.setLastname("Lee");
    			freel.setName("Thampson");
    			Tel tel=new Tel();
    			tel.setCountry("USA");
    			tel.setNumber("08757575");
    			tel.setPrefix("dunno");
    			freel.setTel(tel);
    			freel.setYear("47");
    			session.saveOrUpdate(freel);
    			session.getTransaction().commit();
    		}
    		catch(Exception e){
    			e.printStackTrace();
    		}
    		return freel.getId();
    	}
    	public Long createAndStoreSal(){
    		Session session=null;
    		Salarie emp=new Salarie();
    		try{
    			session=HibernateUtil.getSessionFactory().getCurrentSession();
    			session.beginTransaction();
    			System.out.println("SAISIE DONNEE EMP : ");
    			emp.setAddr("4rd Street 258 70658 Memphys");
    			emp.setDept("Accounting");
    			emp.setFct("Accounting Manager");
    			emp.setLastname("Teddy");
    			emp.setName("Cooper");
    			Email box=new Email();
    			box.setEAddr("totothediablo@company.us");
    			emp.setEmail(box);
    			Tel tel=new Tel();
    			tel.setCountry("USA");
    			tel.setNumber("06858585");
    			tel.setPrefix("dunno");
    			emp.setTel(tel);
    			emp.setYear("35");
    			session.saveOrUpdate(emp);
    			session.getTransaction().commit();
    		}
    		catch(Exception e){
    			e.printStackTrace();
    		}
    		return emp.getId();
    	}
    }
    Merci d'avance pour vos réactions et j'espère avoir fourni assez de données.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    J'ai l'impression que cela vient du générateur d'identifiant, car le reste du mapping me semble correct.
    Avec postgres, le générateur d'identifiant native revient à utiliser le générateur sequence => il faut donc paramétrer le générateur en lui donnant un nom de séquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <id name="id" column="ID" type="long">
      <generator class="native">
        <param name="sequence">personne_id_seq</param>
      </generator>
    </id>

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 110
    Points : 91
    Points
    91
    Par défaut
    j'ai testé avec une séquence en lui ajoutant un nom (HR_SEQ) et j'obtiens toujours mes exceptions.

    Cependant, peut on débugger un xml ? car je ne vois pas comment à part utiliser le validator du w3c mais c'est limité à l'aspect syntaxique du xml. Si quelqu'un à une astuce ... faite la savoir ;-)

    donc voila ce que j'ai modifier et ce que ça donne :

    la modif : Personne.hbm.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <class name="Personne" table="people" type=>
     
    		<id name="id" column="id">
    			<generator class="sequence">
    				<param name="sequence">HR_SEQ</param>
    			</generator>
    		</id>
    ...
    </class>
    les exceptions :

    Initial SessionFactory creation failed. org.hibernate.MappingException: invalid configuration
    java.lang.NullPointerException
    at hr.HrManager.createAndStoreSal(HrManager.java:43)
    at hr.HrManager.main(HrManager.java:9)
    java.lang.NullPointerException
    at hr.HrManager.createAndStoreFree(HrManager.java:16)
    at hr.HrManager.main(HrManager.java:10)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    tu as mis un seul p à mapping dans le fichier de config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maping resource="hr/Personne.hbm.xml"/>

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 110
    Points : 91
    Points
    91
    Par défaut
    Merci beaucoup Ohanny (je me sens un peu stupide ;-)

    Dit moi tu as une certaine expérience en hibernate ? tu peux me répondre par mp si tu veux.

    Merci pour ton aide

    Manu

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2011, 16h30
  2. Héritage avec une table par classe - chargement
    Par seb35 dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/11/2008, 17h38
  3. Problème avec Insert dans une table contenant deux clés
    Par pure_blue dans le forum Accès aux données
    Réponses: 5
    Dernier message: 23/10/2006, 19h32
  4. [Conception] Problème avec INSERT dans une TABLE
    Par dunbar dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 20/07/2006, 12h56
  5. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 15h45

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