6 pièce(s) jointe(s)
Problème de récupération d'objets liés
Bonjour,
Je suis en train de développer une appli en jee avec hibernate, spring et struts II côté serveur et j'utilise javascript, angular côté client. J'utilise aussi une base de données MariaDB comprise dans LAMPP.
Mon problème est le suivant :
Je ne récupère pas, côté client dans le json, les objets Produit et Conditionnement liés avec l'objet ProduitsConditionnes.
Pourtant, dans la classe action, si j'écris getProduit(), j'obtiens bien en log le produit lié avec mon objets ProduitsConditionnes .... C'est simplement que l'objet lié n'est pas lié dans le json. voici mon test que j'ai inséré dans la méthode "repertoire" de la classe ProduitsConditionnesAction :
Code:
log.info("designation produit : " + pc.getProduit().getDesignation());
et le résultat en console après appel de la méthode repertoire :
Code:
1 2
| 2016-07-31 21:37:04,471 INFO [http-nio-8080-exec-7] actions.ProduitsConditionnesAction (ProduitsConditionnesAction.java:59) - designation produit : Nems au porc
2016-07-31 21:37:04,472 INFO [http-nio-8080-exec-7] actions.ProduitsConditionnesAction (ProduitsConditionnesAction.java:59) - designation produit : Samoussas végétariens |
Donc on voit bien que la désignation du produit a été récupérée. C'est donc qu'elle est bien présente dans le Produit qui lui est présent dans le ProduitConditionne ... mais pourquoi non envoyée en json au client ????:fou:
Voici les messages issus de la console d'Eclipse suite à un appel des objets (sans le test précédent) :
Code:
1 2 3 4 5 6 7 8
| 2016-07-31 21:19:56,232 INFO [http-nio-8080-exec-5] actions.IndexAction (IndexAction.java:14) - Appel de index
2016-07-31 21:19:56,455 INFO [http-nio-8080-exec-7] actions.ProduitsConditionnesAction (ProduitsConditionnesAction.java:55) - ProduitsConditionnesAction - repertoire
2016-07-31 21:19:56,473 INFO [http-nio-8080-exec-7] dao.GenericDAO (GenericDAO.java:30) - GenericDAO : findAll - from ProduitConditionne
Hibernate: select produitcon0_.idProduitConditionne as idProdui1_6_, produitcon0_.idConditionnement as idCondit5_6_, produitcon0_.designation as designat2_6_, produitcon0_.enCarte as enCarte3_6_, produitcon0_.prixProdCond as prixProd4_6_, produitcon0_.idProduit as idProdui6_6_ from ProduitConditionne produitcon0_
Hibernate: select conditionn0_.idConditionnement as idCondit1_2_0_, conditionn0_.designation as designat2_2_0_, conditionn0_.quantite as quantite3_2_0_ from Conditionnement conditionn0_ where conditionn0_.idConditionnement=?
Hibernate: select produit0_.idProduit as idProdui1_5_0_, produit0_.designation as designat2_5_0_, produit0_.prix as prix3_5_0_, produit0_.stock as stock4_5_0_ from Produit produit0_ where produit0_.idProduit=?
Hibernate: select conditionn0_.idConditionnement as idCondit1_2_0_, conditionn0_.designation as designat2_2_0_, conditionn0_.quantite as quantite3_2_0_ from Conditionnement conditionn0_ where conditionn0_.idConditionnement=?
Hibernate: select produit0_.idProduit as idProdui1_5_0_, produit0_.designation as designat2_5_0_, produit0_.prix as prix3_5_0_, produit0_.stock as stock4_5_0_ from Produit produit0_ where produit0_.idProduit=? |
et, dans le html, j'ai fait exprès de vouloir afficher l'objet afin de pouvoir visualiser le json (cela évite de faireF12 ...), ce qui donne ceci :
Pièce jointe 216899
--> On voit bien dans l'image précédente que les objets Produit et Conditionnement sont vides car il y a des accolades vides.
Voici la structure dans PHPMyAdmin de l'objet ProduitsConditionnes, on voit su'il est lié à l'objet Produit et à l'objet Conditionnement :
Pièce jointe 216898
voici les lignes présentes dans ProduitsConditionnes :
Pièce jointe 216902
Voici maintenant la structure de Produit :
Pièce jointe 216900
voici les lignes présentes dans Produiit :
Pièce jointe 216903
et voici la structure de Conditionnement :
Pièce jointe 216901
et voici l'objet en java :
Code:
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.chezyen.commandes.metier;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Entity
public class ProduitConditionne implements IGenericEntity {
public static Logger log = LogManager.getLogger(ProduitConditionne.class);
@Id@GeneratedValue
private int idProduitConditionne;
private String designation;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="idProduit")
private Produit produit;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="idConditionnement")
private Conditionnement conditionnement;
private double prixProdCond;
private boolean enCarte;
public ProduitConditionne() {}
public ProduitConditionne(int idProduitConditionne, String designation, Produit produit, Conditionnement conditionnement, double prixProdCond,
boolean enCarte) {
this(designation, produit, conditionnement, prixProdCond, enCarte);
this.idProduitConditionne = idProduitConditionne;
}
public ProduitConditionne(String designation, Produit produit, Conditionnement conditionnement, double prixProdCond,
boolean enCarte) {
super();
this.designation = designation;
this.produit = produit;
this.conditionnement = conditionnement;
this.prixProdCond = prixProdCond;
this.enCarte = enCarte;
}
public int getIdProduitConditionne() {return idProduitConditionne;}
public void setIdProduitConditionne(int idProduitConditionne) {this.idProduitConditionne = idProduitConditionne;}
public String getDesignation() {return designation;}
public void setDesignation(String designation) {this.designation = designation;}
public Produit getProduit() {return produit;}
public void setProduit(Produit produit) {this.produit = produit;}
public Conditionnement getConditionnement() {return conditionnement;}
public void setConditionnement(Conditionnement conditionnement) {this.conditionnement = conditionnement;}
public double getPrixProdCond() {return prixProdCond;}
public void setPrixProdCond(double prixProdCond) {this.prixProdCond = prixProdCond;}
public boolean isEnCarte() {return enCarte;}
public void setEnCarte(boolean enCarte) {this.enCarte = enCarte;}
@Override
public int fetchPrimaryKey() {
log.info("ProduitConditionne : fetchPrimaryKey()");
return getIdProduitConditionne();
}
} |
voici la classe action qui gère la demande :
Code:
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.chezyen.commandes.actions;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.chezyen.commandes.beans.ProduitsConditionnesBean;
import com.chezyen.commandes.dao.IProduitConditionneDAO;
import com.chezyen.commandes.metier.Conditionnement;
import com.chezyen.commandes.metier.Produit;
import com.chezyen.commandes.metier.ProduitConditionne;
import com.opensymphony.xwork2.ActionSupport;
public class ProduitsConditionnesAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Logger log = LogManager.getLogger(ProduitsConditionnesAction.class);
private IProduitConditionneDAO produitConditionneDAO;
public IProduitConditionneDAO getProduitConditionneDAO() {return produitConditionneDAO;}
public void setProduitConditionneDAO(IProduitConditionneDAO produitConditionneDAO) {this.produitConditionneDAO = produitConditionneDAO;}
private int produitConditionneID;
private String produitConditionneDesignation;
private Produit produitConditionneProduit;
private Conditionnement produitConditionneConditionnement;
private double produitConditionnePrixProdCond;
private boolean produitConditionneEnCarte;
public int getProduitConditionneID() {return produitConditionneID;}
public void setProduitConditionneID(int produitConditionneID) {this.produitConditionneID = produitConditionneID;}
public String getProduitConditionneDesignation() {return produitConditionneDesignation;}
public void setProduitConditionneDesignation(String produitConditionneDesignation) {this.produitConditionneDesignation = produitConditionneDesignation;}
public Produit getProduitConditionneProduit() {return produitConditionneProduit;}
public void setProduitConditionneProduit(Produit produitConditionneProduit) {this.produitConditionneProduit = produitConditionneProduit;}
public Conditionnement getProduitConditionneConditionnement() {return produitConditionneConditionnement;}
public void setProduitConditionneConditionnement(Conditionnement produitConditionneConditionnement) {this.produitConditionneConditionnement = produitConditionneConditionnement;}
public double getProduitConditionnePrixProdCond() {return produitConditionnePrixProdCond;}
public void setProduitConditionnePrixProdCond(double produitConditionnePrixProdCond) {this.produitConditionnePrixProdCond = produitConditionnePrixProdCond;}
public boolean isProduitConditionneEnCarte() {return produitConditionneEnCarte;}
public void setProduitConditionneEnCarte(boolean produitConditionneEnCarte) {this.produitConditionneEnCarte = produitConditionneEnCarte;}
private ProduitConditionne produitConditionne;
public ProduitConditionne getProduitConditionne() {return produitConditionne;}
private List<ProduitConditionne> produitsConditionnes;
public List<ProduitConditionne> getProduitsConditionnes() {return produitsConditionnes;}
public String repertoire() {
log.info("ProduitsConditionnesAction - repertoire");
this.produitsConditionnes = produitConditionneDAO.findAll();
for(ProduitConditionne pc : this.produitsConditionnes){
pc.setProduit(pc.getProduit());
produitsConditionnes.set(produitsConditionnes.indexOf(pc), pc);
}
return SUCCESS;
}
} |
voici l'interface IProduitConditionneDAO :
Code:
1 2 3 4 5
| package com.chezyen.commandes.dao;
import com.chezyen.commandes.metier.ProduitConditionne;
public interface IProduitConditionneDAO extends IGenericDAO<ProduitConditionne>{} |
L'interface IGenericDAO :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.chezyen.commandes.dao;
import java.util.List;
import com.chezyen.commandes.metier.IGenericEntity;
public interface IGenericDAO <T extends IGenericEntity>{
// renvoie la liste des entite de type T
List<T> findAll();
// recupere une entite de type T
T findByID(int id);
T save(T entity);
T remove(int id);
} |
La classe ProduitConditionneDAO :
Code:
1 2 3 4 5 6 7 8 9 10 11
| package com.chezyen.commandes.dao;
import com.chezyen.commandes.metier.ProduitConditionne;
public class ProduitConditionneDAO extends GenericDAO<ProduitConditionne> implements IProduitConditionneDAO{
public ProduitConditionneDAO() {
super(ProduitConditionne.class);
}
} |
Pour le côté navigateur, voic le html :
Code:
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 69 70 71 72 73 74 75
| <!DOCTYPE html>
<html ng-app="chezYenApp">
<head>
<meta charset="UTF-8">
<title>Gestion des produits conditionnés</title>
<link type="text/css" rel="stylesheet" href="../css/bootstrap.css" />
<link type="text/css" rel="stylesheet" href="../css/bootstrap-theme" />
<link type="text/css" rel="stylesheet" href="../css/header.css" />
<script type="text/javascript" src="../js/jquery-2.2.0.js"></script>
<script type="text/javascript" src="../js/angular.js"></script>
<script type="text/javascript" src="../js/angular-route.js"></script>
<script type="text/javascript" src="../js/gestion_produits_conditionnes.js"></script>
<script type="text/javascript" src="../js/chezYenDirective.js"></script>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css">
<link type="text/css" rel="stylesheet" href="../css/gestion_produits_conditionnes.css"/>
<script>
$(document).ready(function(){
$(nouveauProduitConditionne).on('click', function() {
$('#panelNouveauProduitConditionne').slideToggle(600);
});
});
</script>
</head>
<body>
<div id="chezYenBar">
<img id="left" src="../images/logo_stylise.png" class="img-responsive center-block"/>
<div id="center">
<h3 style="color: #fff8d7;">
<a style="color: #fff8d7;" href="../index.html">ACCEUIL</a> / GESTION DES PRODUITS CONDITIONNES
</h3>
</div>
<img id="right" src="../images/logo_stylise.png" class="img-responsive center-block"/>
</div>
<div class="container" ng-controller="produitsConditionnesCtrl">
<div class="col-sm-12" style="padding-right: 30px;">
<table id="tableProduitsConditionnes" class="table table-striped">
<thead>
<tr>
<th>Désignation</th>
<th>Produit</th>
<th>Conditionnement</th>
<th>Prix</th>
<th>en carte ?</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="pc in produitsConditionnes">
<td style="display:none;" ng-model="idProduitConditionne">{{pc.idProduitConditionne}}</td>
<td>{{pc}}</td>
<td>{{pc.produit.designation}}</td>
<td>{{pc.conditionnement.designation}}</td>
<td>{{pc.produit.prix}}</td>
<td>{{pc.enCarte}}</td>
<td>
<button class="btn btn-default"
ng-click="modifier_produit_conditionne(produitConditionne.idProduitConditionne)">Modifier</button>
<button class="btn btn-danger"
ng-click="supprimer_produit_conditionne(produitConditionne.idProduitConditionne)">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html> |
Et
Code:
1 2 3 4 5 6 7 8 9 10 11
| var chezYenApp = angular.module("chezYenApp", []);
chezYenApp.controller("produitsConditionnesCtrl", function($scope, $http){
$scope.produitsConditionnes = [];
$scope.produitConditionneModif;
$scope.produitsConditionnes = [];
$http.get('../gestProduitsConditionnes/repertoire').then (function(response) {
$scope.produitsConditionnes = response.data.produitsConditionnes;
});
}); |
J'ai mon code sur github à l'adresse suivante (branche dev) :
https://github.com/franckyy/commandes_CY
et le dernier commit est ici :
https://github.com/franckyy/commande...463fa532c645ae