Table sans primary key avec Hibernate/JAVA

Table sans primary key avec Hibernate/JAVA - Java - Programmation

Marsh Posté le 20-02-2007 à 09:22:40    

Bonjour, voici mon souci.
Je veux avoir acces aux données d'une TABLE A qui n'a pas de clé primaire (car elle a été faite il y a longtemps).
Pour obtenir une clé unique de la TABLE A, je concatene 9 champs de la table (ce qui me donne un String).
Et dans mon code j'ai une variable:
List<String> listKey
qui contient l'ensemble des cles unique, et que je souhaite récupérer une liste: List<MonObject> listMonObject
correspondant au cle unique de la variable listKey.
Or la TABLE A contient + de 500 000 lignes et ca prend 2 jours au moins
 
Voici ma methode dans mon dao:

Code :
  1. @SuppressWarnings("unchecked" )
  2. public List<MonObject> listByConcatIdProperty(final List<String> propertyList) {
  3.  final String request = String.format(" from %s"
  4.    + " as monObject where (monObject .id.property1 ||'.'|| monObject .id.property2 ||'.'|| "
  5.    + "monObject .id.property3 ||'.'|| monObject .id.property4 ||'.'|| monObject .id.property5 ||'.'|| "
  6.    + "monObject .id.property6 ||'.'|| monObject .id.property7 ||'.'|| monObject .id.property8 ||'.'|| "
  7.    + "monObject .id.cdevcot ||'.'|| monObject .id.property9) in (:propertyList)", getReferenceClass()
  8.    .getName());
  9.  final Query query = this.getCacheableQuery(request);
  10.  query.setParameterList("propertyList", propertyList);
  11.  return query.list();
  12. }


 
 
Auriez-vous une idee d'une autre maniere de procéder qui serai beaucoup + rapide?
 
Merci d'avance.

Reply

Marsh Posté le 20-02-2007 à 09:22:40   

Reply

Marsh Posté le 20-02-2007 à 10:04:22    

pas possible, il faut une clef primaire.
 
quel rapport avec hibernate ce que tu donnes là ?
 
mets tes 9 champs dans l'id de ta table, et pis voilà.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-02-2007 à 10:26:14    

brisssou a écrit :

pas possible, il faut une clef primaire.
 
quel rapport avec hibernate ce que tu donnes là ?
 
mets tes 9 champs dans l'id de ta table, et pis voilà.


 
l'inconveignent c'est que je ne peux pas rajouter de clef primaire :(

Reply

Marsh Posté le 20-02-2007 à 10:50:57    

brisssou a écrit :


mets tes 9 champs dans l'id de ta table, et pis voilà.


 
http://www.hibernate.org/hib_docs/ [...] ompositeid
 
maÿssapu


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-02-2007 à 11:10:33    

oui j'ai déjà creer une cle composite avec les 9 champs. Mais je doit copier les donnée de la TABLE A dans une TABLE B. Or il y a + de 500 000 lignes.
Donc j'ai un OutOfMemoryError si je stock les Id dans une List<MonObjectId>.
J'ai donc concatené ces 9 champs en un seul String, pour avoir une List<String>, afin d'eviter le probleme de memoire.  
Ensuite je recupere les MonObject 500 par 500 dans une List<MonObject> pour les mettre dans ma TABLE B.
Mais au bout de 10 minutes je commence a avoir des OutOfMemoryError  aussi :(

Reply

Marsh Posté le 20-02-2007 à 11:20:12    

du coups j'essaye d'utiliser ScrollableResults mais pour l'instant c pas evident, j'essaye de comprendre...

Reply

Marsh Posté le 20-02-2007 à 11:40:25    

est-ce que ça serait pas plus performant de faire l'insert directement en SQL ?

Code :
  1. INSERT INTO TABLE_B
  2. SELECT *
  3. FROM TABLE_A
  4. WHERE ...


 
non ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-02-2007 à 11:44:14    

brisssou a écrit :

est-ce que ça serait pas plus performant de faire l'insert directement en SQL ?

Code :
  1. INSERT INTO TABLE_B
  2. SELECT *
  3. FROM TABLE_A
  4. WHERE ...


 
non ?


 
euh ce genre de trucs fonctionne pas trop en general :(

Reply

Marsh Posté le 20-02-2007 à 11:48:13    

après un rapide (très rapide en fait) tour sur google (j'ai donc rien vérifié à fond), mySQL semble supporter ce genre de syntaxe. Si mySQL le fait, je suppose qu'un paquet d'autres doivent le faire aussi, non ?


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 20-02-2007 à 12:02:29    

Pour remonter un cran au dessus dans un modele relationnel si tu as deux tables avec la meme structure c'est qu'il y a surement un souci de modelisation ...

Message cité 1 fois
Message édité par cooltwan le 20-02-2007 à 12:02:46
Reply

Marsh Posté le 20-02-2007 à 12:02:29   

Reply

Marsh Posté le 20-02-2007 à 12:05:20    

non elles n'ont pas le meme nombre de champs, juste une dizaine de champs en commun

Reply

Marsh Posté le 20-02-2007 à 12:12:47    

pourquoi tu ecris pas dans un fichier tout ça progressivement pour pas saturer la memoire ?

Reply

Marsh Posté le 20-02-2007 à 13:05:52    

cooltwan a écrit :

Pour remonter un cran au dessus dans un modele relationnel si tu as deux tables avec la meme structure c'est qu'il y a surement un souci de modelisation ...


 
 
pas faux. Mais déjà, des tables sans clef primaire [:mlc] donc bon. Et puis, c'était un exemple hein !


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed