JEE heritage jpa/hibernate

seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014 - 4 nov. 2014 à 15:49
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 7 nov. 2014 à 07:02
Bonjour a tous,


j'ai une petite question qui n'est pas spécialement un problème mais plus une demande pour avoir la bonne pratique ou la méthode la plus maintenable.

j'ai un projet java EE,

j'utilise Spring les annotation JPA, Hibernate...
-DAO
-SERVICES
-FACADE
-FRONT (JSF / Primefaces)


concrètement j'ai :

une class Produit (properties get/set/constructeur)

une class A extends Produit (properties get/set/constructeur)
avec une ListDeA<String>

une class B extends Produit (properties get/set/constructeur)
avec une ListDeB<A>

j'ai structuré mon projet avec un module maven

je fait une requête de mon Managed-Bean a ma facade->ServiceProduit-DAOProduit-getAll() qui retourne la list des Produits.

ma liste contient donc des Produit de type A et B

je suis donc obligé si je veux une afficher une des ListDeA ou B de faire un cast (A) ou (B) de l'élément itéré ou bien j'utilise un rendered ?

Quel sont les autre solution ?

Et si je fait un findById() c'est pareil je suis obligé de fair un cast ou un rendered ?

la question c'est donc la méthode utilisé est elle propre y a t'il mieux (performance, polymorphe)?

merci par avance pour votre aide
c'est peut être pas claire comme problème... désolé
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
4 nov. 2014 à 21:18
Bonjour,

Puisque tu fais du JPA il faut réfléchir côté base de données. En pratique tu auras probablement une seule table Produit, pas de multiples tables A et B.

Donc même si tu modélises ça après avec des classes A et B, tu devrais pouvoir te contenter des méthodes de la classe Produit, ou mieux : des méthodes d'une interface que la classe Produit implémenterait.
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
4 nov. 2014 à 22:49
Bonsoir KX,

merci pour ta réponse,

ma classe Produit est une entity :


package com.apps.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

import com.apps.entity.model.CategorieProduit;
import com.apps.entity.model.StatutProduit;
import com.apps.entity.model.TypeProduit;

@Entity
@NamedQueries(value = {
@NamedQuery(name="Produit.findByReferenceProduit", query="SELECT p FROM Produit p WHERE p.referenceProduit = :referenceProduit"),
@NamedQuery(name="Menu.findByReferenceMenu", query="SELECT m FROM Menu m WHERE m.referenceProduit = :referenceMenu"),
@NamedQuery(name="ProduitComposer.findByReferenceProduitComposer", query="SELECT s FROM ProduitComposer s WHERE s.referenceProduit = :referenceProduitComposer"),
})
public abstract class Produit implements Serializable {

/**
*
*/
private static final long serialVersionUID = 604548651610003728L;

@Id
@GeneratedValue
private Long produitID;
private String referenceProduit;
private TypeProduit typeProduit;
private CategorieProduit categorieProduit;
private String nomProduit;
private String nomImageProduit;
private double prixProduit;
private StatutProduit statutProduit;

public Produit() {

}

@Override
public String toString() {
return "Categorie: "+this.categorieProduit+" type: "+this.typeProduit+" : "+this.nomProduit+" Prix : "+this.prixProduit+" Disponibilite : "+this.statutProduit;
}

public TypeProduit getTypeProduit() {
return typeProduit;
}

public void setTypeProduit(TypeProduit typeProduit) {
this.typeProduit = typeProduit;
}

public String getNomProduit() {
return nomProduit;
}

public void setNomProduit(String nomProduit) {
this.nomProduit = nomProduit;
}

public String getNomImageProduit() {
return nomImageProduit;
}

public void setNomImageProduit(String nomImageProduit) {
this.nomImageProduit = nomImageProduit;
}

public StatutProduit getStatutProduit() {
return statutProduit;
}

public void setStatutProduit(StatutProduit statutProduit) {
this.statutProduit = statutProduit;
}

public String getReferenceProduit() {
return referenceProduit;
}

public void setReferenceProduit(String referenceProduit) {
this.referenceProduit = referenceProduit;
}
public Long getProduitID() {
return produitID;
}

public void setProduitID(Long produitID) {
this.produitID = produitID;
}

public double getPrixProduit() {
return prixProduit;
}

public void setPrixProduit(double prixProduit) {
this.prixProduit = prixProduit;
}

public CategorieProduit getCategorieProduit() {
return categorieProduit;
}

public void setCategorieProduit(CategorieProduit categorieProduit) {
this.categorieProduit = categorieProduit;
}
}


un Menu extends Produit

package com.apps.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class Menu extends Produit {
/**
*
*/
private static final long serialVersionUID = 604548651610003728L;
@OneToMany//(cascade = CascadeType.PERSIST)
private List<ProduitComposer> produits;

public Menu() {
this.setProduits(new ArrayList<ProduitComposer>());
}

public List<ProduitComposer> getProduits() {
return produits;
}

public void setProduits(List<ProduitComposer> produits) {
this.produits = produits;
}

@Override
public String toString() {
return super.toString();
}
}


et un ProduitComposer


package com.apps.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class ProduitComposer extends Produit {

/**
*
*/
private static final long serialVersionUID = 604548651610003728L;

@OneToMany//(cascade = CascadeType.PERSIST)
private List<Ingredient> ingredients;

public ProduitComposer() {
this.setIngredients(new ArrayList<Ingredient>());
}

@Override
public String toString() {
return super.toString();
}

public List<Ingredient> getIngredients() {
return ingredients;
}

public void setIngredients(List<Ingredient> ingredients) {
this.ingredients = ingredients;
}
}


Actuellement j ai une table produit effectivement, mais les dépendances de type list avec leur @OneToMany... crée des tables de jointures

c'est bien la que je galère je modélise cela par des Class qui étendent produit, mais peut être que ce n'est pas la bonne chose a faire ???
J'ai n'est pas bien compris ce que tu veux dire, quand tu parle d'implémenter des méthodes a produit, quel méthode ?

peut tu me donné un exemple ?
peut être que mon explication de base est foireuse :-/ j'ai ajouter les Class afin que ce soit plus claire... peut-être.

Merci beaucoup, j ai déjà de quoi réfléchir avec ta première réponse.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
4 nov. 2014 à 23:04
Montre voir la table Produit et celles sur lesquelles tu veux faire des jointures, ainsi que quelques lignes d'exemples pour bien voir les différents cas d'utilisation que tu pourrais avoir à traiter.

Remarque :

@Override
public String toString() {
	return super.toString();
}

À quoi ça te sert de surcharger une méthode qui va faire la même chose que si tu ne l'avais pas surcharger ? Ça ne sert absolument à rien.
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
Modifié par KX le 4/11/2014 à 23:33
Merci pour ton aide,
voila pour la table avec les données mais aussi mon git hub cela pourrait bien être plus simple :

https://github.com/seichan/CasaDiPaniniMavenMU.git

Table :

Produit sql :
http://www.hostingpics.net/viewer.php?id=163811produit.png

produit join ingredient sql :

produit join produit sql :

ingredient sql :

PS: pour la méthode toString() je l'ai simplement oublié mais je passerais mes Class au propre après avoir bien compris ce qui est utile dans ce type de contexte.

modifiction des lien... >_<"
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
6 nov. 2014 à 23:34
Bonsoir,

je me suis prix la tête sur mon problème, bien qu'il n'en soit pas vraiment un, le truc c'est que je me demande si il y a possibilité d'écrire le service produit de manier plus polymorphe je revient sur ce que je disait au début de ce topic.

voici la Class serviceProduitImlp qui me pose problème.
je souhaite éviter les if et les redondances de codes
mais aussi que l'objet que retourne la méthode soit du bon type.

j'en suis donc la et je bloc...
si vous avez une proposition... merci par avance pour votre temps.


package com.apps.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.apps.dao.IDAOMenu;
import com.apps.dao.IDAOProduit;
import com.apps.dao.IDAOProduitComposer;
import com.apps.dto.ProduitDTO;
import com.apps.entity.Menu;
import com.apps.entity.ProduitComposer;
import com.apps.entity.model.CategorieProduit;
import com.apps.services.IServiceProduit;

@Service
@Transactional
public class ServiceProduitImpl implements IServiceProduit {

@Autowired
private IDAOProduit produitDAO;
@Autowired
private IDAOMenu menuDAO;
@Autowired
private IDAOProduitComposer produitComposerDAO;
@Autowired
private Mapper mapper;

private static final Logger logger = Logger.getLogger(ServiceClientImpl.class);

@Override
public List<ProduitDTO> getAllProduit() {
logger.info("Service demande au dao la liste des produits lourde");

List<ProduitDTO> produitDTOs = new ArrayList<ProduitDTO>();

for (Menu menu : this.menuDAO.getAllMenu()) {
produitDTOs.add(mapper.map(menu, ProduitDTO.class));
}

for (ProduitComposer produitComposer : this.produitComposerDAO.getAll()) {
produitDTOs.add(mapper.map(produitComposer, ProduitDTO.class));
}
return produitDTOs;
}

@Override
public List<ProduitDTO> getAllMenu() {
logger.info("Service demande au dao la liste des produits lourde");

List<ProduitDTO> produitDTOs = new ArrayList<ProduitDTO>();

for (Menu menu : this.menuDAO.getAllMenu()) {
produitDTOs.add(mapper.map(menu, ProduitDTO.class));
}
return produitDTOs;
}

@Override
public List<ProduitDTO> getAllProduitComposer() {
logger.info("Service demande au dao la liste des produits lourde");

List<ProduitDTO> produitDTOs = new ArrayList<ProduitDTO>();

for (ProduitComposer produitComposer : this.produitComposerDAO.getAll()) {
produitDTOs.add(mapper.map(produitComposer, ProduitDTO.class));
}
return produitDTOs;
}

@Override
public List<ProduitDTO> getAllProduitLazy() {
logger.info("Service demande au dao la liste des produits lazy");

List<ProduitDTO> produitDTOs = new ArrayList<ProduitDTO>();

for (Menu menu : this.menuDAO.getAllMenu()) {
produitDTOs.add(mapper.map(menu, ProduitDTO.class, "menu_lazy"));
}

for (ProduitComposer produitComposer : this.produitComposerDAO.getAll()) {
produitDTOs.add(mapper.map(produitComposer, ProduitDTO.class, "produit_composer_lazy"));
}
return produitDTOs;
}

@Override
public void save(ProduitDTO produitDTO) {
logger.info("Service demande au dao de sauver le produit");

if (produitDTO.getCategorieProduit() == CategorieProduit.MENU) {
this.menuDAO.save(mapper.map(produitDTO, Menu.class));
} else if (produitDTO.getCategorieProduit() == CategorieProduit.PRODUIT_COMPOSER) {
this.produitComposerDAO.save(mapper.map(produitDTO, ProduitComposer.class));
}
}

@Override
public ProduitDTO getProduitByID(Long produitID) {
logger.info("Service demande au dao le produit par id");
return mapper.map(this.produitDAO.find(produitID), ProduitDTO.class);
}

@Override
public ProduitDTO getProduitByRef(String referenceProduit) {
logger.info("Service demande au dao le produit par ref");
return mapper.map(this.produitDAO.find(referenceProduit), ProduitDTO.class);
}

@Override
public void update(ProduitDTO produitDTO) {
logger.info("Service demande au dao de metre a jour le produit");

if (produitDTO.getCategorieProduit() == CategorieProduit.MENU) {
this.menuDAO.update(mapper.map(produitDTO, Menu.class));
} else if (produitDTO.getCategorieProduit() == CategorieProduit.PRODUIT_COMPOSER) {
this.produitComposerDAO.update(mapper.map(produitDTO, ProduitComposer.class));
}
}

@Override
public void remove(ProduitDTO produitDTO) {
logger.info("Service demande au dao de supprimer le produit");

if (produitDTO.getCategorieProduit() == CategorieProduit.MENU) {
this.menuDAO.remove(mapper.map(produitDTO, Menu.class));
} else if (produitDTO.getCategorieProduit() == CategorieProduit.PRODUIT_COMPOSER) {
this.produitComposerDAO.remove(mapper.map(produitDTO, ProduitComposer.class));
}
}
}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié par KX le 7/11/2014 à 07:05
Bonjour,

Une idée de simplification, il faudrait bien sûr l'adapter aux différents cas.

public static <R, S> void addForEach(List<S> sources, List<R> results, Mapper mapper, Class<R> classResult)
{
    for (S source : sources)
        results.add(mapper.map(source, classResult));
}

@Override
public List<ProduitDTO> getAllProduit()
{
    logger.info("Service demande au dao la liste des produits lourde");
    List<ProduitDTO> produitDTOs = new ArrayList<ProduitDTO>();
    addForEach(menuDAO.getAllMenu(), produitDTOs, mapper, ProduitDTO.class);
    addForEach(produitComposerDAO.getAll(), produitDTOs, mapper, ProduitDTO.class);
    return produitDTOs;
}
0
Rejoignez-nous