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

JPA Java Discussion :

JPA : Souci en faisant un SET avec un LAZY


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de silverfab34
    Inscrit en
    Mars 2006
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mars 2006
    Messages : 203
    Par défaut JPA : Souci en faisant un SET avec un LAZY
    Bonjour à tous,
    Je travaille sur une application Java/J2ee avec JSF et JPA, et j'ai un souci avec mon JPA....

    Quand je veux "setter " (faire setSubIndustryCollection), à partir de Industry, ca ne me met pas la valeur dans SubIndustry....pourtant je lui envoie bien quelque chose...
    En EAGER, ca marche bien mais je veux le laisser en LAZY au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToMany(mappedBy="industryId",fetch=FetchType.LAZY,cascade=CascadeType.ALL)
    	private List<SubIndustry> subIndustryCollection;
    pour ne pas remonter toute la base à chaque fois !

    Est ce normal qu'en LAZY on ne puisse pas faire ce genre d'action ?

    Merci pour votre aide ou vos explications.


    Voici mon code :

    J'ai 2 Entités où Sub_Industry découle d'Industry et une industrie peut avoir plusieurs sous-industries....


    Industry.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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    @Entity
    @NamedQueries({@NamedQuery(name="getIndustry", query = "SELECT i FROM Industry i"),@NamedQuery(name="getIndustryByIndustryId", query = "SELECT i FROM Industry i WHERE i.industryId = :industryId"),
    @NamedQuery(name="getIndustryByIndustryName", query = "SELECT i FROM Industry i WHERE i.industryName = :industryName"),
    @NamedQuery(name="getIndustryNameOrder", query = "SELECT i FROM Industry i ORDER BY i.industryName")})
    public class Industry implements Serializable {
    	@Id
    	@Column(name="INDUSTRY_ID")
    	private int industryId;
     
    	@Column(name="INDUSTRY_NAME")
    	private String industryName;
     
    	private static final long serialVersionUID = 1L;
     
    	@OneToMany(mappedBy="industryId",fetch=FetchType.LAZY,cascade=CascadeType.ALL)
    	private List<SubIndustry> subIndustryCollection;
     
     
     
    	public Industry() {
    		super();
    	}
     
    	public int getIndustryId() {
    		return this.industryId;
    	}
     
    	public void setIndustryId(int industryId) {
    		this.industryId = industryId;
    	}
     
    	public String getIndustryName() {
    		return this.industryName;
    	}
     
    	public void setIndustryName(String industryName) {
    		this.industryName = industryName;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#hashCode()
    	 */
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + industryId;
    		return result;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#equals(java.lang.Object)
    	 */
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj) {
    			return true;
    		}
    		if (obj == null) {
    			return false;
    		}
    		if (!(obj instanceof Industry)) {
    			return false;
    		}
    		Industry other = (Industry) obj;
    		if (industryId != other.industryId) {
    			return false;
    		}
    		return true;
    	}
     
    	/** 
             */
    	public List<SubIndustry> getSubIndustryCollection() {
    		return this.subIndustryCollection;
    	}
     
    	/** 
             */
    	public void setSubIndustryCollection(List<SubIndustry> subIndustryCollection) {
    		this.subIndustryCollection = subIndustryCollection;
    	}
     
     
     
    }
    SubIndustry.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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    @Entity
    @Table(name="SUB_INDUSTRY")
    @NamedQueries({@NamedQuery(name="getSubIndustry", query = "SELECT s FROM SubIndustry s"),@NamedQuery(name="getSubIndustryBySubIndustryId", query = "SELECT s FROM SubIndustry s WHERE s.subIndustryId = :subIndustryId"),
    @NamedQuery(name="getSubIndustryBySubIndustryName", query = "SELECT s FROM SubIndustry s WHERE s.subIndustryName = :subIndustryName"),
    @NamedQuery(name="getSubIndustryByIndustryId", query = "SELECT s FROM SubIndustry s WHERE s.industryId.industryId = :industryId_industryId"),
    @NamedQuery(name="getSubIndByIndustryIdOrder", query = "SELECT s FROM SubIndustry s WHERE s.industryId.industryId = :industryId_industryId ORDER BY s.subIndustryName")})
    public class SubIndustry implements Serializable {
    	@Id
    	@Column(name="SUB_INDUSTRY_ID")
    	private int subIndustryId;
     
    	@Column(name="SUB_INDUSTRY_NAME")
    	private String subIndustryName;
     
    	@ManyToOne(fetch=FetchType.LAZY)
    	@JoinColumn(name="INDUSTRY_ID")
    	private Industry industryId;
     
    	private static final long serialVersionUID = 1L;
     
     
    	public SubIndustry() {
    		super();
    	}
     
    	public int getSubIndustryId() {
    		return this.subIndustryId;
    	}
     
    	public void setSubIndustryId(int subIndustryId) {
    		this.subIndustryId = subIndustryId;
    	}
     
    	public String getSubIndustryName() {
    		return this.subIndustryName;
    	}
     
    	public void setSubIndustryName(String subIndustryName) {
    		this.subIndustryName = subIndustryName;
    	}
     
    	public Industry getIndustryId() {
    		return this.industryId;
    	}
     
    	public void setIndustryId(Industry industryId) {
    		this.industryId = industryId;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#hashCode()
    	 */
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + subIndustryId;
    		return result;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#equals(java.lang.Object)
    	 */
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj) {
    			return true;
    		}
    		if (obj == null) {
    			return false;
    		}
    		if (!(obj instanceof SubIndustry)) {
    			return false;
    		}
    		SubIndustry other = (SubIndustry) obj;
    		if (subIndustryId != other.subIndustryId) {
    			return false;
    		}
    		return true;
    	}
     
    }

    Mon Bean où je récupère mon objet Industry en fonction de son ID et récupèrer la liste de sous industries lui appartenant....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    IndustryManager indManager = (IndustryManager)getManagedBean("industryManager");
    		Industry ind = indManager.findIndustryByIndustryId(industryId);
    		ind.setSubIndustryCollection(new ArrayList<SubIndustry>());
     
     
    		for (Iterator<SubIndustry> i = allSubInd.iterator(); i.hasNext(); ) {
    			SubIndustry si = (SubIndustry) i.next();
    			ind.getSubIndustryCollection().add(si);
    			listSub_i.add(new SelectItem(si.getSubIndustryId(),si.getSubIndustryName()));
    		}
     
     
    		ind.setSubIndustryCollection(allSubInd);

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    En EAGER, ca marche bien mais je veux le laisser en LAZY au niveau de :
    C'est clairement vouloir le beurre et son argent , la politique EAGER précharge les objets liés à une entité, ce qui donne donc l'avantage qu'ils peuvent être flushés automatiquement dans la base sans rajout de code, l'inconvenient c'est qu'ils sont préchargés même quand on n'en veut pas, en d'autres termes le fonctionnement que tu as , est normal, ce que je peux te conseiller c que dans la relation inverse de ton mapping tu mettes la politique EAGER, et dans la boucle ce sera plutot aux sous industries que tu affecteras une industrie, compris ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    Par défaut
    avant de chercher des explications compliquées : corriger le code…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Industry ind = indManager.findIndustryByIndustryId(industryId);
    ind.setSubIndustryCollection(new ArrayList<SubIndustry>());
    		
    for (Iterator<SubIndustry> i = allSubInd.iterator(); i.hasNext(); ) {
    	SubIndustry si = (SubIndustry) i.next();
    	ind.getSubIndustryCollection().add(si);
    	listSub_i.add(new SelectItem(si.getSubIndustryId(),si.getSubIndustryName()));
    }
     		
    ind.setSubIndustryCollection(allSubInd);
    çà ne sert à rien de faire des "add" si c'est pour remplacer la collection par une autre à la fin…

    et il vous manque un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    si.setIndustry(ind);
    de plus, ce code est fait pour "bootstrapper" la DB (à cause du ind.setSubIndustryCollection(new ArrayList<SubIndustry>())),
    si vous l'exécutez sur des Industry contenant déjà des SubIndustry vous allez avoir des surprises…

  4. #4
    Membre confirmé Avatar de silverfab34
    Inscrit en
    Mars 2006
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mars 2006
    Messages : 203
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    avant de chercher des explications compliquées : corriger le code…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Industry ind = indManager.findIndustryByIndustryId(industryId);
    ind.setSubIndustryCollection(new ArrayList<SubIndustry>());
    		
    for (Iterator<SubIndustry> i = allSubInd.iterator(); i.hasNext(); ) {
    	SubIndustry si = (SubIndustry) i.next();
    	ind.getSubIndustryCollection().add(si);
    	listSub_i.add(new SelectItem(si.getSubIndustryId(),si.getSubIndustryName()));
    }
     		
    ind.setSubIndustryCollection(allSubInd);
    çà ne sert à rien de faire des "add" si c'est pour remplacer la collection par une autre à la fin…

    et il vous manque un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    si.setIndustry(ind);
    de plus, ce code est fait pour "bootstrapper" la DB (à cause du ind.setSubIndustryCollection(new ArrayList<SubIndustry>())),
    si vous l'exécutez sur des Industry contenant déjà des SubIndustry vous allez avoir des surprises…
    Oui, je l'ai fait comme ca car je pensais justement que ca passait pas !!
    A l'origine, je faisais un si.setIndustry(ind);


    Mais je pense avoir trouvé une solution car en fait dans mon InudustryManager, au niveau de mon FIND, j'ai rajouté :
    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
    	@Action(Action.ACTION_TYPE.FIND)
    	public Industry findIndustryByIndustryId(int industryId) {
    		Industry industry = null;
    		EntityManager em = getEntityManager();
    		try {
    			industry = (Industry) em.find(Industry.class, industryId);
    			industry.getSubIndustryCollection();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			em.close();
    		}
    		return industry;
    	}
    Et maintenant ca marche en LAZY !

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Dans ta nouvelle solution , t'es bien conscient qu'à chaque fois que tu feras un findIndustry il te tirera toutes les sous industries ? c une forme implicite de EAGER mais en post opération ca. et puis je ne vois pas l'intérêt de faire une méthode findIdustry, peut on voir ta méthode getEntityManager()?

  6. #6
    Membre confirmé Avatar de silverfab34
    Inscrit en
    Mars 2006
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mars 2006
    Messages : 203
    Par défaut
    JE suis d'accord, c'est une sorte de EAGER :

    Voici mon EntityManger

    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
     
    	@PersistenceUnit
    	private EntityManagerFactory emf;
     
    	public IndustryManager() {
     
    	}
     
    	private EntityManager getEntityManager() {
    		emf = Persistence.createEntityManagerFactory("Projet_Test");
    		return emf.createEntityManager();
    	}
    ....
    ..
    @Action(Action.ACTION_TYPE.FIND)
    	public Industry findIndustryByIndustryId(int industryId) {
    		Industry industry = null;
    		EntityManager em = getEntityManager();
    		try {
    			industry = (Industry) em.find(Industry.class, industryId);
    			industry.getSubIndustryCollection();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			em.close();
    		}
    		return industry;
    	}
     
    ..
     
    };

Discussions similaires

  1. Soucis d'accès au données avec IIS
    Par Rouge_XIII dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/10/2006, 18h28
  2. [Hibernate] Set avec une seule valeur
    Par neuromencien dans le forum Hibernate
    Réponses: 6
    Dernier message: 15/05/2006, 17h49
  3. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 13h09
  4. find() de std::set avec fonction de comparaison
    Par Biglo dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/01/2006, 09h50
  5. Réponses: 5
    Dernier message: 30/11/2004, 18h04

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