Bonjour,

J'ai débuté il y a quelques mois un projet avec Java et Hibernate. J'ai préféré utiliser les annotations que je trouvaient plus légère que les fichiers de mapping, mais le problème c'est que je crois que j'ai compris de travers l'utilisation d'hibernate pour ce qui est des associations...

Si l'on a une classe Parent qui représente un Parent d'une famille monoparentale , et qui contient un HashMap d'enfants,

On déclare la relation

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
 
 
@Entity
public Class Parent{
 
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int id;
 
   @OneToMany(mappedBy = "parents",  cascade = { CascadeType.ALL}, targetEntity = Enfant.class)
   private Map<Enfant> enfants;
 
   //... constructeur vide , getters et setters
 
}
 
@Entity
public Class Enfant{
 
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int id;
 
   private String nom;
 
 
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.EAGER) //Si le fils meur, le père survis. Quand on charge l'enfants, on charge aussi le père
   private Parent parents;
 
    //... constructeur vide , getters et setters
 
}

Maintenant lorsque dans le code on aimerais depuis le père, parcourir la liste des enfants, je suis toujours embêté, car j'ai toujours une lazy exception si j'accède au Map d'enfants. Si maintenant je met la relation du père en Eager, j'ai un "Cannot fetch multiple bag" d'après ce que j'ai du sur le site d'hibernate c'est une fatalité on ne peut pas mettre d'eager sur un OneToMany.

Est-ce que je dois à chaque fois (pour chaque classe ou le cas de présente) définir des méthodes avec une requête SQL qui va charger les enfants depuis la base de données, ou est-ce qu'hibernate le fait automatiquement? Car je me dis qu'il doit bien pouvoir faire cela automatiquement tellement c'est courant.


Deuxième question: Si j'ai un HashMap avec des objets complexes (plusieurs listes) mais qui sont des données "temporaires", est-ce que je peux persister un HashMap d'un coup, sans avoir besoin de déclarer tous les types qui y sont contenu? Genre de le sérialiser dans un champ binaire et le ressortir tel quel après???

Parce que j'ai trouvé plein de tuto ou ils disent que c'est possible mais moi l’obtient ça:
Problème de configuration : Could not determine type for: java.util.Map, for columns: [org.hibernate.mapping.Column(data)]

Pour info j'utilise en terme Maven, entre autre les dépendances suivantes:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>1.0.1.GA</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.2.1.ga</version>
</dependency>

<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>

Il est fort possible qu'il y ait des incohérences là dedans... j'ai du bricoler parmi 3 ou 4 tuto différents pour trouver tout ce qu'il me fallait... J'utilise pour faire des tests une base de données SQLite et du coup je dois garder des vieilles versions d'hibernate... Mais si ce problème est réglé dans les versions plus récentes je laisse tomber SQLite qui est pas très performante...

Ces deux question dont je ne trouve pas de réponses toute faites, me font perdre des heures depuis des mois...

Merci infiniment d'avance