J'ai un très très grand nombre de donnée, d'où un problème massif de taille disque et de mémoire.
Coté BDD :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Class A { Map<String,B> map; } Class B { long id; A monParent; String nom; }
Une Table A represente les objects A
Une Table B represente les objects B
J'ai environ 500 000 Object A
Un Object A est lié à environ 1000 object B representant ses parametres
Cette Table B possède donc des Millions d'enregistrements
cette table a un champ NOM de type String de longueur max 256
Cela me pose le problème de place car des Millions de B * 256 ça commence à faire beaucoup sur le disque ;-)
Si je regarde attentivement l'ensemble des NOM possibles pour B, ils peuvent être contenue dans une table de reference NOM_REF qui elle ne contient du coup qu'environ 1000 à 2000 valeurs.
Table NOM_REF
int id
String name
et B devient
Ca a le mérite de permettre de remplacer dans B le NOM par un NOM_REF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Class B { long id; A monParent; NomRef refDunNom; }
d'ou un gain de place énorme puisque chaque B me coute 254 octets de moins en base
Jusque là je suis content ;-)
Par contre le problème arrive avec la classe A :
Map<String,B> devient Map<NomRef,B>
Le hashCode de NomRef n'est pas invariant comme pour une string :-(
ce qui me pose d'enorme problème pour retrouver l'objet B
Meme si je m'amuse à redefinir le hashcode et le equal de NomRef (en se basant par exemple sur l'Id) comme c'est Hibernate qui me les remontent depuis la BDD je suis dans l'incapacité de le rendre invariant (hibernate fait les set sur les attributs ce qui change le hashcode)
Je bloque un peu sur les solutions possibles l'ideal je pense serais d'arriver à ce que les
la Map re devienne une Map<String,B> mais comment faire pour qu'hibernate utilise le champ ou l'id de NomRef pour faire sa clé...
Partager