JPA Salvando icone jpg no Banco

2 respostas
gui_sv

Olá Pessoal,

Estou com um problemão que à semana semana tentando não resolvo .... bom vamos lá ...

Conforme a especificação JPA, para salvar devo utilizar um atributo byte[] e anotá-lo com @Lob

model:
...
	@Lob
	@Column(name="IMAGE_")
	@Basic(fetch=FetchType.EAGER)
	private byte[] image;

//getter and setter

Daí eu permito ao usuario escolher o item que desejar e o sistema faz o upload do arquivo em um local temp. Faço isso utilizando a tag do ICEFaces .
Quando o upload é concluido ele me retorna um java.io.File.

Para poder persistir devo converter este File para byte[]

faço isso da seguinte maneira:
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
				byte buffer[] = new byte[4096];
				int bytesRead = 0;
				FileInputStream fi = new FileInputStream(this.file.getAbsolutePath());
				while ((bytesRead = fi.read(buffer))!=-1){
					arrayOutputStream.write(buffer,0,bytesRead);
				}
				
				arrayOutputStream.close();
				fi.close();
Seto o atributo:
newCiType.setImage(arrayOutputStream.toByteArray());
E chamo o cara que persist:
ICTypeFacadeImpl.create(newCiType);
metodo create:
public static void create(ConfigurationItemType icType) {
		
		EntityManager em = JPAUtility.getEntityManager();
		EntityTransaction transaction = em.getTransaction();
		transaction.begin();
		
		em.persist(icType);
		transaction.commit();
		
		em.close();
		
	}
Ao termino de tudo isso: Ocorre um erro intermitente (ora sim ora nao):
Caused by: java.sql.SQLException: operação não permitida: streams type cannot be used in batching
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
	at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:3999)
	at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.addBatch(WrappedPreparedStatement.java:264)
	at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:31)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
	... 75 more

Não sei o que é pq ora funfa ora nao funfa ... urghhhhhh

Valeu galera

2 Respostas

alrosot

Tenho o mesmo problema.
Algum progresso com o seu caso?

[]s

Sparcx86

amigão teu problema é dos menores. dos menores porque pelo que vi a tua imagem é pequena e podes jogar tudo em um array e tacar o foda-se pra o banco de dados e memoria.
E eu que preciso persistir N imagens!? acho que jpa não faz persistencia de streams do tipo URL, como se voce quiser baixar de um lugar e jogar para o outro. O jeito acho que é jogar mesmo pra um jdbc puro nesses momentos de salvar binarios.

O certo era ter algo que pega-se de um inputstream e joga-se para um outputstream que fosse para o banco de dados.
Se isso existe infelizmente está escondido a sete chaves! Em jpa não há 1 exemplo factível dessa merda. :x

Criado 29 de maio de 2008
Ultima resposta 14 de dez. de 2009
Respostas 2
Participantes 3