Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 14/01/2011 13:50:52
- genamiga
- Membre
Comment stocker un DefaultTreeModel dans une base PostgreSQL ?
Bonjour,
Dans mon programme Java je construit un arbre en lisant ma base. L'arbre créer contient pour l'instant 300 éléments et c'est assez long...
Pour l'instant je reconstruit l'arbre uniquement quand il y a des changements. Mais s'il y a un changement dans une autre instance du programme je dois reconstruire alors que l'autre instance l'a déjà fait.
Donc j'aimerais stocker le DefaultTreeModel dans la base...
Dans la table PostgreSQL la colonne est un OID (BLOB)... dois-je utiliser autre chose ?
J'ai essayé avec
preparedStatement.setObject( 4, arbre, Types.OTHER );
Mais j'ai l'erreur
org.postgresql.util.PSQLException: ERREUR: syntaxe invalide en entrée pour le type oid : « javax.swing.tree.DefaultTreeModel@1b4d774f »
En fait il semble vouloir stocker l'adresse de l'objet et pas l'objet lui-même.
Si qlq a une idée...
Merci d'avance.
Hors ligne
#2 14/01/2011 21:56:44
- flo
- Membre
Re : Comment stocker un DefaultTreeModel dans une base PostgreSQL ?
Je suppose que c'est parce que cet objet n'implémente pas les bonnes interfaces, ou bien n'est pas de la bonne classe :
http://download.oracle.com/javase/1.4.2 … .Object%29
De toute manière, comment pouvez-vous espérer stocker un arbre, donc une structure pleine de pointeurs, dans une suite d'octets? Même Postgresql n'est pas capable de cette sorte de magie...
Il manque donc une étape de sérialisation avant l'étape JDBC, si c'est vraiment ce que vous voulez faire (mais là c'est du pur Java).
D'autre part, sur le fond de votre problème, je ne comprend pas l'intérêt de mettre cela dans la base. Pourquoi ne pas faire un objet partagé par tous vos threads, résidant en mémoire? (quand vous parlez d'instances, c'est quoi? des processus? des threads? les changements de l'un doivent se répercuter dans l'autre?)
Hors ligne
#3 16/01/2011 19:06:25
- genamiga
- Membre
Re : Comment stocker un DefaultTreeModel dans une base PostgreSQL ?
En effet, l'objet que j'essaie de stocker dans la base n'est pas sérialisé.
Donc j'ai écrit les méthodes de sérialisation et désérialisation qui me permettent de lire et écrire dans un objet Java dans la base de données.
// ========================================================================================================================================================
/**
* Sérialise un objet : Convertit un objet non sérialisé en byte[] sérialisé
* @param objetNonSérialisé
* @return
*/
public static byte[] sérialiseObjet(Object objetNonSérialisé){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(objetNonSérialisé);
oos.flush();
oos.close();
}
catch (java.io.IOException e) {
e.printStackTrace();
}
return bos.toByteArray();
}
// ========================================================================================================================================================
/**
* Désérialise : Convertit un objet sérialisé en byte[] en objet
* @param objetSérialisé
* @return
*/
public static Object déSerialiseObjet(byte[] objetSérialisé){
Object objetDéSérializé = null;
try {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(objetSérialisé));
objetDéSérializé = ois.readObject();
} catch (IOException ex) {
} catch (ClassNotFoundException ex) {
GuiUserCom.erreur(ex);
}
return objetDéSérializé;
}
Si ça peut servir à qlq...
Ensuite il suffit de lire et écrire un Blob sur une colonne OID.
Dernière modification par genamiga (19/01/2011 08:45:54)
Hors ligne