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 : Sélectionner tout - Visualiser dans une fenêtre à part
log.info("designation produit : " + pc.getProduit().getDesignation());
et le résultat en console après appel de la méthode repertoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ????


Voici les messages issus de la console d'Eclipse suite à un appel des objets (sans le test précédent) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Nom : capture_cy.png
Affichages : 84
Taille : 28,3 Ko

--> 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 :
Nom : structure_pc.png
Affichages : 82
Taille : 81,6 Ko

voici les lignes présentes dans ProduitsConditionnes :
Nom : aff_prodCond.png
Affichages : 81
Taille : 26,3 Ko

Voici maintenant la structure de Produit :
Nom : structure_prod.png
Affichages : 102
Taille : 50,4 Ko

voici les lignes présentes dans Produiit :
Nom : aff_prod.png
Affichages : 78
Taille : 28,6 Ko

et voici la structure de Conditionnement :
Nom : structure_cond.png
Affichages : 79
Taille : 36,9 Ko

et voici l'objet en java :
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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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