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

Langage Java Discussion :

Set non generic non accepté ?


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de POKOU
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 121
    Par défaut Set non generic non accepté ?
    Bonjour

    avec le JDK 1.6.0_18,
    je declare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import java.util.Set;
    public class Category implements Serializable{
    	private int ID;
    	private String name;
    	private Category parentCategory;
    	private Set childCategories = new HashSet();
    ma table est :
    CREATE TABLE IF NOT EXISTS `category` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    et à l'exécution la JVM renvoie :
    Caused by: javax.persistence.PersistenceException: org.hibernate.MappingException: Could not determine type for: java.util.Set, for columns: [org.hibernate.mapping.Column(categories)]
    Pourquoi je ne peux utiliser de Set non généric ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le message d'erreur ne parle absolument pas de Set générique ou non.
    La raison en est probablement que ça n'a rien à voir.

    Nous manquons d'élément pour déterminer ce qui ne plaît pas à Hibernate dans la configuration de ton mapping. (Mais il est évident que la seule et unique table que tu nous as montrée ne peut pas contenir les catégorie filles d'une catégorie, puisqu'il n'y a pas de colonne pour ça.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    1) pourquoi ne pas utiliser un Set<Category>, comme ça hibernate saura tout de suite de quoi parle le Set,

    dans le cas contraire, il faut être explicite dans le mapping (préciser que c'est du one-to-many qui pointe vers des catégories)

    dans le deuxième cas, faudrait qu'on voie ton mapping pour te le corriger.

  4. #4
    Membre confirmé Avatar de POKOU
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 121
    Par défaut
    merci pour vos réponses

    En fait j'essaye de comprendre (en la faisant tourner) cette logique là :
    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
    package beans;
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    import javax.persistence.*;
    
    @Entity 
    public class Category implements Serializable{
    	private int ID;
    	private String name;
    	private Category parentCategory;
    	private Set<Category> childCategories = new HashSet<Category>();
    	
    	public Category(){
    	}
    
    	@Id @GeneratedValue(strategy=GenerationType.AUTO)	
    	public int getID() {
    		return ID;
    	}
    	public void setID(int iD) {
    		ID = iD;
    	}
    //=======================================================		
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    //=======================================================		
    	public Category getParentCategory() {
    		return parentCategory;
    	}
    	public void setParentCategory(Category parentCategory) {
    		this.parentCategory = parentCategory;
    	}
    //=======================================================		
    	public Set<Category> getChildCategories() {
    		return childCategories;
    	}
    	public void setChildCategories(Set<Category> childCategories) {
    		this.childCategories = childCategories;
    	}
    //=======================================================		
    	public void addChildCategory(Category childCategory) {
    		if (childCategory == null)
    			throw new IllegalArgumentException("Null child category!");
    		if (childCategory.getParentCategory() != null)
    			childCategory.getParentCategory().getChildCategories().remove(childCategory);
    		childCategory.setParentCategory(this);
    		childCategory.addChildCategory(childCategory);
    }
    	}
    logique qui permet (si j'ai bien compris) d'éviter la création d'une table supplémentaire (childcategory) et de clés étrangères.

    dans mon contexte.xml il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    <bean 	id="categoryModel"
    		class="models.CategoryModel"/>
    et mon modele est :
    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
    import beans.Category;
    import interfaces.ICategoryModel;
     
    @Transactional
    public class CategoryModel implements ICategoryModel {
     
    	private EntityManager entityManager;
    //=======================================================	
    	@PersistenceContext
    	public void setEntityManager(EntityManager entityManager){
    		this.entityManager = entityManager;
    	}
    //=======================================================				
    	@Override
    	public Category addChildCategory(Category childCategory) {
    		if (childCategory.getID() != 0)
    			entityManager.merge(childCategory);
    		else
    			((Category) entityManager).addChildCategory(childCategory);
    		return null;
    	}
    //=======================================================				
    	@Override
    	public Category find(String name){
    		return entityManager.find(Category.class, name);
    	}
    il faut encore que je révise la généricité et que je piste bien mon mapping.
    je n'ai pas encore bien compris l'utilisation de scope= , donc affaire à suivre

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par POKOU Voir le message
    En fait j'essaye de comprendre (en la faisant tourner) cette logique là :
    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
    package beans;
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    import javax.persistence.*;
    
    @Entity 
    public class Category implements Serializable{
    	private int ID;
    	private String name;
    	private Category parentCategory;
    	private Set<Category> childCategories = new HashSet<Category>();
    	
    	public Category(){
    	}
    
    	@Id @GeneratedValue(strategy=GenerationType.AUTO)	
    	public int getID() {
    		return ID;
    	}
    	public void setID(int iD) {
    		ID = iD;
    	}
    //=======================================================		
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    //=======================================================		
    	public Category getParentCategory() {
    		return parentCategory;
    	}
    	public void setParentCategory(Category parentCategory) {
    		this.parentCategory = parentCategory;
    	}
    //=======================================================		
    	public Set<Category> getChildCategories() {
    		return childCategories;
    	}
    	public void setChildCategories(Set<Category> childCategories) {
    		this.childCategories = childCategories;
    	}
    //=======================================================		
    	public void addChildCategory(Category childCategory) {
    		if (childCategory == null)
    			throw new IllegalArgumentException("Null child category!");
    		if (childCategory.getParentCategory() != null)
    			childCategory.getParentCategory().getChildCategories().remove(childCategory);
    		childCategory.setParentCategory(this);
    		childCategory.addChildCategory(childCategory);
    }
    	}
    logique qui permet (si j'ai bien compris) d'éviter la création d'une table supplémentaire (childcategory) et de clés étrangères.
    Euh, c'est pas magique. Certes tu n'as pas besoin d'une table supplémentaire. Mais il te faut au moins une colonne PARENT_ID avec une clé étrangère vers la colonne ID de la même table.

    Après, comment faire pour que Hibernate gère correctement ce Set de sous-catégories, là, je vais devoir laisser parler les gens qui en ont une idée .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé Avatar de POKOU
    Homme Profil pro
    developpeur
    Inscrit en
    Décembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 121
    Par défaut
    1) j'avais oublié le bean Category dans le persistence.xml
    2) j'ai utilisé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	private HashSet<Category> childCategories = new HashSet<Category>();
    et ça passe
    merci pour vos réponses qui m'ont plus qu'éclairé

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Hum, il me semble avoir lu quelque part qu'avec hibernate (mais de toute façon de manière générale), il vaut mieux Utiliser l'interface Set dans la déclaration plutôt que HashSet.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    exact, rien ne garantit que jpa / hibernate fournira un Hashset et non par un TreeSet ou un HibernantePersistentSet ...

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

Discussions similaires

  1. [MAVEN] Generics non supportés
    Par ziad.shady dans le forum Maven
    Réponses: 3
    Dernier message: 24/02/2010, 14h54
  2. clause de non sollicitation - non concurence
    Par Alwin dans le forum Contrat
    Réponses: 22
    Dernier message: 02/10/2009, 15h47
  3. Clavier du portable non reconnu, non démarrage de Vista
    Par Dennis Nedry dans le forum Périphériques
    Réponses: 12
    Dernier message: 12/07/2009, 11h41
  4. Réponses: 1
    Dernier message: 24/11/2006, 16h15

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