2010-11-28 4 views
2

J'essaie de sauver un objet dans une colonne de postgre (bytea) avec le code suivant:Saving objet java à un problème PostgreSQL

Utilisateur utilisateur = new Utilisateur("aa","aa","aa",10,"aaammm",12,Role.ADMINISTRATEUR); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(utilisateur); 
     oos.close(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 

     Connection connection = null; 
     PreparedStatement preparedStatement = null; 


     connection = Connect(); 
     String SOME_SQL= "INSERT INTO test (id, objet) VALUES(?, ?)"; 
     preparedStatement = connection.prepareStatement(SOME_SQL); 
     preparedStatement.setBinaryStream(2, bais); 
     preparedStatement.setInt(1, 11); 
     preparedStatement.executeUpdate(); 
     preparedStatement.close(); 

Mais je reçois ce exeption:

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532) 
    at org.eclipse.ve.internal.java.vce.launcher.remotevm.JavaBeansLauncher.main(JavaBeansLauncher.java:86) 
Caused by: org.postgresql.util.PSQLException: Function org.postgresql.jdbc4.Jdbc4PreparedStatement.setBinaryStream(int, InputStream) is not implemented. 
    at org.postgresql.Driver.notImplemented(Driver.java:753) 
    at org.postgresql.jdbc4.AbstractJdbc4Statement.setBinaryStream(AbstractJdbc4Statement.java:129) 
    at com.grst.connector.SerializeToDatabase.<init>(SerializeToDatabase.java:35) 
    ... 5 more 

Je suppose qu'il n'y a pas de setBinaryStream (int, InputStream) implémenté dans jdbc4. Il y a un autre moyen de le faire?

Répondre

9

Vous devez utiliser setBinaryStream(int, InputStream, int) où le troisième paramètre indique la longueur du flux d'entrée en octets.

Donc, dans votre cas ce serait quelque chose comme:

 
byte[] data = baos.toByteArray(); 
ByteArrayInputStream bais = new ByteArrayInputStream(data); 
.. 
.. 
preparedStatement.setBinaryStream(2, bais, data.length);