Сохранение Java-объекта в проблему PostgreSQL - PullRequest
2 голосов
/ 29 ноября 2010

Я пытаюсь сохранить объект в столбце postgre (bytea) со следующим кодом:

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();

Но я получаю это исключение:

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

Я предполагаю, что в jdbc4 не реализовано setBinaryStream (int, InputStream) Есть ли другой способ сделать это?

1 Ответ

9 голосов
/ 29 ноября 2010

Вам нужно использовать setBinaryStream(int, InputStream, int), где третий параметр обозначает длину входного потока в байтах.

Так что в вашем случае это будет что-то вроде:

byte[] data = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
..
..
preparedStatement.setBinaryStream(2, bais, data.length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...