Gravar objeto java serializado no banco Oracle

Pessoal, preciso gravar um objeto serializado numa coluna de uma tabela no banco Oracle… porém nao faço nem ideia de como fazer… qual melhor tipo de dado pra setar na coluna da tabela?

Vi um exemplo em que é setado na tabela do oracle uma coluna como BLOB, e o codigo java da um setBlob no PreparedStatement, porem executei esse exemplo aki e ele da uma exceção:

Exception occurred during event dispatching:
java.lang.AbstractMethodError: oracle.jdbc.driver.T2CPreparedStatement.setBlob(ILjava/io/InputStream;)V

Alguem aí tem alguma dica? Qq eu devo fazer?

  • Não recomendaria serializar objetos em arquivos, quanto mais em colunas de bancos de dados, porque isso deixa seus objetos muito “amarrados”. Você não pode modificar a declaração dos objetos serializados, e se bobear nem pode mudar a versão da JVM que você está usando. Esse tipo de problema é comum com o JasperReports, que trabalha com relatórios que são objetos serializados em arquivos.
    De qualquer maneira, use um BLOB mesmo.

Mas como eu codifico no java? como eu faço essa gravação?

http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/9i_jdbc/NewLOBAPISample/Readme.html

Fiz uma implementação assim:

[code] try {
PreparedStatement statement = connection.prepareStatement(this.getSQL());

        statement.setString(1, r.getNome());
        statement.setString(2, r.getDescricao());
        statement.setBlob(3, r.getObjeto());
        statement.setString(4, r.getBloqueado());

        statement.executeUpdate();
        connection.commit();
        statement.close();
    } catch (SQLException exception) {
        throw new DatabaseException(exception);
    }[/code]

onde o metodo getObjeto do objeto r retorna um InputStream… porém continua dando a mesma excessão:

Exception occurred during event dispatching: java.lang.AbstractMethodError: oracle.jdbc.driver.T2CPreparedStatement.setBlob(ILjava/io/InputStream;)V

Já li milhoes de tutorias e todos falam pra fazer do jeito q eu ja to fazendo… :frowning:

Se você precisa realmente quer salvar o “estado” do objeto, mas não o objeto em si, você poderia utilizar o XStream e gerar o xml a partir do objeto e vice-versa.

link: http://xstream.codehaus.org/

Exemplo prático:

XStream xstream = new XStream(new DomDriver());
xstream.alias(“person”, Person.class);
String xml = xstream.toXML(joe);

e depois:
Person newJoe = (Person)xstream.fromXML(xml);

e no blob vc salvar o conteúdo xml.

fw

Complementanto…

não use setBlob no Oracle…

OutputStream blobOutputStream = rs.getBinaryOutputStream(); blobOutputStream.write(buffer, 0, tamanho); blobOutputStream.close();

e para ler:

[code] while( rs.next() ) {
do {
qde++;
codigo = rs.getString(1);
arq = rs.getBlob(2);

                try {
                    // tenta ler o blob
                    bin = arq.getBinaryStream();
                    bytesRead = bin.read(bbuf);
                    // se chegou aqui ta tudo certo...
                } catch( Exception e ) {
                    // o blob deve estar corrompido
                    psIns.setString(1,codigo);
                    psIns.executeUpdate();
                    log.warning("Blob corrompido: "+codigo);
                }
            } while( rs.next() );[/code]

fw