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

Frameworks Web Java Discussion :

Mapping Objet-Relationel avec JPA :héritage


Sujet :

Frameworks Web Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 25
    Points
    25
    Par défaut Mapping Objet-Relationel avec JPA :héritage
    Bonjour
    je suis entrain de développer une application distribuer JEE EJB JPA
    j'ai mon shémas de base de donné que je veut le transformer en entité JPA
    là ou j'ai un héritage en 2 niveau , Personne , PersonneMorale , PersonnePhysique , acheteur vendeur ...
    j'ai chois la stratégie" single table "
    sauf que lorsque je fait le mapping avec JPA je block au niveu transformation de la table personne en entité(classe fille) c'est à dire[ PersonneMorale , PersonnePhysique , acheteur vendeur ...]
    en plus que j'ai des relation entre ces classe et d'autre classe like facture , devis , commande qui contient deux clés étranger de la table personne .
    j'ai parcouru pas mal de thread sur forum mais presque aucune me répond à mon besoin
    merci pour vos suggestion .
    cordialement .

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Salut,

    Regarde dans le cours java de jmdoudou

    JPA - Chapitre 46

    EJB - Chapitre 52 à 54.

    Relis bien tout et refait

    Sinon montre nous ton code

    bonne chance

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    bon merci bien

    bref j'ai fais plusieurs lecture

    alors j'ai prit cet stratégie :
    une seule table personne lui correspond une entité personnePhysique , acheteur, vendeur : avec une colonne discriminante =>
    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
     
    @Entity
    @Table(name="personne")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="Disc")
    public class Personne implements Serializable {
    	private static final long serialVersionUID = 1L;
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	@Column(unique=true, nullable=false)
    	private int idpersonne;
     
    	@Column(length=45)
    	private String email;
    ...........}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Entity
    @DiscriminatorValue( "PPhy")
    public class PersonnePhysique extends Personne implements Serializable {
     
     
     
    	@Column(length=45)
    	private String nom;
    	@Column(length=45)
    	private String prenom;
    	private static final long serialVersionUID = 1L;
    ......}
    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
     
    @Entity
    @DiscriminatorValue("Vendeur")
    public class Vendeur extends Personne implements Serializable {
     
     
    	private static final long serialVersionUID = 1L;
     
    	public Vendeur() {
    		super();
    	}
    	  @ManyToOne
    		@JoinColumn(name="id_domaine")
    		private Domaine domaine;
    	@OneToMany(mappedBy="personne", fetch=FetchType.LAZY)
    	private List<Coordonnee> coordonnees;
    	public List<Coordonnee> getCoordonnees() {
    		return this.coordonnees;
    ......}
    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
     
    @Entity
    @DiscriminatorValue( value = "Vendeur")
    public class Acheteur extends Personne implements Serializable {
     
     
    	private static final long serialVersionUID = 1L;
     
    	public Acheteur() {
    		super();
    	}
    	@OneToMany(mappedBy="personne", fetch=FetchType.LAZY)
    	private List<Coordonnee> coordonnees;
    	public List<Coordonnee> getCoordonnees() {
    		return this.coordonnees;
    	}
    ..........
    }
    .... en plus j'ai d'autre classe avec les quelle j'ai créer les relations disant tout les relation avec la table personne ; comme par exemple un vendeur possède plusieurs produits ...
    mon fichier de persistance est le suivant
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.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_2_0.xsd">
    <persistence-unit name="testEJB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    .......
    .....
    <class>org.com.Message</class>
    <class>org.com.Personne</class>
    <class>org.com.Produit</class>
    <class>org.com.Role</class>
    <class>org.com.Souscategorie</class>
    <class>org.com.Tva</class>
    <class>org.com.PersonnePhysique</class>
    <class>org.com.Acheteur</class>
    <class>org.com.Vendeur</class>
     
    <properties>
    <!-- <property name="hibernate.transaction.manager_lookup_class"
    value="org.hibernate.transaction.JBossTransactionManagerLookup" /> -->
     
    <property name="hibernate.connection.url" value="jdbc:mysql://localhost/basepfe"/>
    <property name="hibernate.connection.username" value="root" />
    <property name="hibernate.connection.password" value="mon password mysql"/>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
     
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="show_sql" value="true" />
    </properties>
    j'ai voulu Tester la persistance d'une entité avant de passer , alors j'ai créer un simple TestCase avec Junit4 :
    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
     
    private static Logger logger = Logger.getLogger(PersistenceUnitTest.class.getName());
        private EntityManagerFactory emFactory;
        private EntityManager em;
        public test4(String testName) {
            super(testName);
        }
     
    	@Override
    	public void setUp() throws Exception {
    		super.setUp();
    		System.out.print("0");
    		 emFactory=Persistence.createEntityManagerFactory("testEJB");
    		 System.out.print("1");
    		em= emFactory.createEntityManager();
    		//if (em!=null)
    			System.out.print("2");
     
    		}
    	@Override
    	public void tearDown() throws Exception {
    		super.tearDown();
    		if(em!=null)
    			em.close();
     
    	if (emFactory !=null){emFactory.close();}
    	}
    	@Test
    	public void test() {
    		em.getTransaction().begin();
    		Tva tva=new Tva();
    		tva.setLibTva("testetst");
    		em.persist(tva);
    		assertTrue(em.contains(tva));
    		em.getTransaction().commit();		
    	}
    le test ne fonctionne pas et l'erreur est la suivante : cannot simultaneously fetch multiple bags
    cette erreur est avec une entité qui contien des relation et même avec une simple entité sans aucune relation ;
    j'ai essayer de changer EAGER en LAZY comem proposé dans d'autres thread mais sans aucun changement ...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    merci je vient de résoudre le problème en modifiant toutes les LIST en des Set dans tout les entity ... et ça marche
    il parait que c'est un beug de JPA

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

Discussions similaires

  1. Réponses: 44
    Dernier message: 05/10/2011, 15h37
  2. Mapper Une Map avec JPA
    Par yashiro dans le forum JPA
    Réponses: 0
    Dernier message: 23/12/2009, 19h40
  3. Réponses: 1
    Dernier message: 31/01/2009, 21h58
  4. [C++]Mapping objet relationnel avec Mysql
    Par sessime dans le forum C++
    Réponses: 1
    Dernier message: 19/12/2008, 19h48
  5. Objet Query avec un héritage multiple
    Par QAYS dans le forum Langage
    Réponses: 5
    Dernier message: 01/11/2007, 11h18

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