[RESOLVIDO] JPA, Imagem e Postgres

2 respostas
wagner_a_lima

Olá pessoal,

Gostaria que me ajudassem no sequinte problema.

Estou fazendo alguns testes para verificar a possibilidade de inserção de imagens diretamente no banco de dados.
Antes, de qualquer coisa, sei que poderia salvar apenas o path da imagem e gravar a imagem em um diretório, porém até o momento, isso não faz parte dos requisitos do projeto.

Fiz inicialmente um teste com JPA (Hibernate e Toplink) e Derby.

@Entity
public class Foto implements Serializable {

    @Id
    private Integer id;
    private String nome;
    @Lob
    @Column(columnDefinition = "BLOB")
    private byte[] foto;
}

Configurei o persistence.xml para gerar as tabelas do banco e ele gerou uma tabela foto (id integer, nome varchar(255), foto BLOB).
Ok. Até aqui tudo ótimo. Testei e funcionou perfeitamente.

Depois testei com JPA (Hibernate e Toplink) e Postgres.
Ai o problema.
Com as mesmas anotações acima, a tabela foto não foi gerada.
Então pela definição de tipo de Large Objects do Postgres, teríamos OID ou Bytea no lugar de Blob.
Então mudei minha entidade para o seguinte:

@Entity
public class Foto implements Serializable {

    @Id
    private Integer id;
    private String nome;
    @Lob
    @Column(columnDefinition = "BYTEA")
    private byte[] foto;
}

Ok. Gerou a tabela no banco, porém quando tento inserir ou alterar no Postgres uma imagem da mesma forma que inseri no Derby. É lançada a seguinte exceção:

javax.persistence.RollbackException: Error while commiting the transaction
        at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
        at br.com.teste.projeto.view.CreateImage.execute(CreateImage.java:36)
        at br.com.teste.projeto.view.CreateImage.main(CreateImage.java:20)
Caused by: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
        ... 2 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 update foto set nome=Foto 1, Foto=26967 where id=11 foi abortada. Chame getNextException para ver a causa.
        at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
Finalizando
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
        ... 10 more

Alguém já implementou alguma coisa do tipo com Postgres?

2 Respostas

Javabuntu

veja esse artigo

carlos_chea

como vc resolveu o seu problema???

Criado 5 de maio de 2009
Ultima resposta 8 de out. de 2011
Respostas 2
Participantes 3