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?