Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/01/2012, 10h31   #1
Membre du Club
 
Avatar de POKOU
 
Homme
Inscription : décembre 2008
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 50
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : décembre 2008
Messages : 87
Points : 56
Points : 56
Par défaut Set non generic non accepté ?

Bonjour

avec le JDK 1.6.0_18,
je declare :
Code :
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 :
Citation:
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 :
Citation:
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 ?
__________________
Je chasse le bug
POKOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h09   #2
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 099
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 099
Points : 7 025
Points : 7 025
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.)
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 12h31   #3
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 199
Points : 25 348
Points : 25 348
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h48   #4
Membre du Club
 
Avatar de POKOU
 
Homme
Inscription : décembre 2008
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 50
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : décembre 2008
Messages : 87
Points : 56
Points : 56
merci pour vos réponses

En fait j'essaye de comprendre (en la faisant tourner) cette logique là :
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
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 :
1
2
3
4
 
...
<bean 	id="categoryModel"
		class="models.CategoryModel"/>
et mon modele est :
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
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
__________________
Je chasse le bug
POKOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h51   #5
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 099
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 099
Points : 7 025
Points : 7 025
Citation:
Envoyé par POKOU Voir le message
En fait j'essaye de comprendre (en la faisant tourner) cette logique là :
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
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 .
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 17h22   #6
Membre du Club
 
Avatar de POKOU
 
Homme
Inscription : décembre 2008
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 50
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : décembre 2008
Messages : 87
Points : 56
Points : 56
1) j'avais oublié le bean Category dans le persistence.xml
2) j'ai utilisé ça :
Code :
1
2
 
	private HashSet<Category> childCategories = new HashSet<Category>();
et ça passe
merci pour vos réponses qui m'ont plus qu'éclairé
__________________
Je chasse le bug
POKOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h10   #7
Membre chevronné
 
Avatar de atha2
 
Homme Gabriel VIOT
Étudiant
Inscription : janvier 2007
Messages : 457
Détails du profil
Informations personnelles :
Nom : Homme Gabriel VIOT
Âge : 24
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2007
Messages : 457
Points : 664
Points : 664
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.
atha2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h28   #8
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 199
Points : 25 348
Points : 25 348
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
exact, rien ne garantit que jpa / hibernate fournira un Hashset et non par un TreeSet ou un HibernantePersistentSet ...
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h48.


 
 
 
 
Partenaires

Hébergement Web