Armazenar um arquivo pdf no banco Posgresql - usando JPA toplink

3 respostas
rconrado

Boa tarde pessoal.
Estou fazendo um trabalho de faculdade e o professor pediu para usar JPA - Toplink
em uma das tabelas preciso inserir um arquivo PDF.
Porem não estou conseguindo inserir o arquivo no Banco utilizando JPA.
Alguem pode me ajudar por favor. é o trabalho final.

CREATE TABLE tgs

(

numero character varying(15) NOT NULL,

aluno character varying(60) NOT NULL,

username character varying(15) NOT NULL,

tema character varying(45) NOT NULL,

titulo character varying(250) NOT NULL,

objetivos text NOT NULL,

justificativas text NOT NULL,

exequibilidade text NOT NULL,

cronograma text NOT NULL,

bibliografia text NOT NULL,

curso character varying(45) NOT NULL,

filetg oid,

CONSTRAINT tgs_pk PRIMARY KEY (numero),

CONSTRAINT fk_tgsuse FOREIGN KEY (username)

REFERENCES usuarios (username) MATCH SIMPLE

ON UPDATE NO ACTION ON DELETE NO ACTION

)

WITHOUT OIDS;

ALTER TABLE tgs OWNER TO postgres;

// A entidade

package sample.datamap;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.Lob;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.OneToMany;

import javax.persistence.Basic;

import javax.persistence.FetchType;

@Entity
@NamedQueries(
@NamedQuery(name = “tgporusername”, query = “SELECT o FROM Tgs o WHERE o.username = :user”)

)

public class Tgs implements Serializable {

@Id

private String numero;
@Lob    @Column(columnDefinition="MEDIUMBLOB")
@Basic(fetch=FetchType.LAZY)
private byte[] filetg;

private String curso;

private String bibliografia;

private String exequibilidade;

private String cronograma;

private String aluno;

private String objetivos;

private String justificativas;

private String tema;

private String titulo;

@ManyToOne
@JoinColumn(name="username")
private Usuarios username;

@OneToMany(mappedBy="naluno")
private Set<Banca> bancaCollection;

@OneToMany(mappedBy="naluno")
private Set<Avaliacao> avaliacaoCollection;

private static final long serialVersionUID = 1L;

public Tgs() {
	super();
}

public String getNumero() {
	return this.numero;
}

public void setNumero(String numero) {
	this.numero = numero;
}

public Usuarios getUsername() {
	return this.username;
}

public void setUsername(Usuarios username) {
	this.username = username;
}

public byte[] getFiletg() {
	return this.filetg;
}

public void setFiletg(byte[] filetg) {
	this.filetg = filetg;
}

public String getCurso() {
	return this.curso;
}

public void setCurso(String curso) {
	this.curso = curso;
}

public String getBibliografia() {
	return this.bibliografia;
}

public void setBibliografia(String bibliografia) {
	this.bibliografia = bibliografia;
}

public String getExequibilidade() {
	return this.exequibilidade;
}

public void setExequibilidade(String exequibilidade) {
	this.exequibilidade = exequibilidade;
}

public String getCronograma() {
	return this.cronograma;
}

public void setCronograma(String cronograma) {
	this.cronograma = cronograma;
}

public String getAluno() {
	return this.aluno;
}

public void setAluno(String aluno) {
	this.aluno = aluno;
}

public String getObjetivos() {
	return this.objetivos;
}

public void setObjetivos(String objetivos) {
	this.objetivos = objetivos;
}

public String getJustificativas() {
	return this.justificativas;
}

public void setJustificativas(String justificativas) {
	this.justificativas = justificativas;
}

public String getTema() {
	return this.tema;
}

public void setTema(String tema) {
	this.tema = tema;
}

public String getTitulo() {
	return this.titulo;
}

public void setTitulo(String titulo) {
	this.titulo = titulo;
}

public Set<Banca> getBancaCollection() {
	return this.bancaCollection;
}

public void setBancaCollection(Set<Banca> bancaCollection) {
	this.bancaCollection = bancaCollection;
}

public Set<Avaliacao> getAvaliacaoCollection() {
	return this.avaliacaoCollection;
}

public void setAvaliacaoCollection(Set<Avaliacao> avaliacaoCollection) {
	this.avaliacaoCollection = avaliacaoCollection;
}

}

// JSP


<html:hidden property=“cmd” value=""/>
<tr> 
						<td width="25%"><bean:message key="naluno"/></td>
						<td valign="top">
							<html:select size="1" property="aluno">
									<html:optionsCollection name="Alunos" property="alunoList" label="aluno" value="aluno"/>
							</html:select>
						</td>
					</tr>
					<tr>
						<td width="25%"><bean:message key="arquivo"/></td>
						<td><html:file property="fileTG" size="25"/></td>
					</tr>
				</table>

// ACTION

if(tgAluno.getAluno().equals(aluno)){
								FormFile tgFile = ((TgForm) form).getFileTG();
								Tgs tg = em.find(Tgs.class, tgAluno.getNumero());
								tg.setFiletg(tgFile.getFileData());
								tx.begin();
								em.merge(tg);
								tx.commit();
							}//end if

Deculpem pelo tamanho do POST.

Obrigado
rafael

3 Respostas

rconrado

segue o erro:
Este Integer (que é apenas o OID do objeto) deve ser gerado automaticamente pelo Postgresql, não deve?
Quando insiro um arquivo usando SQL, utilizo o io_import() e não dá erro. O problema é que como é uma aplicação WEB o arquivo estará na máquina do usuário.

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException:

Exception Description: The object [16,885], of class [class java.lang.Integer], from mapping [oracle.toplink.essentials.mappings.DirectToFieldMapping[filetg–>TGS.FILETG]] with descriptor [RelationalDescriptor(sample.datamap.Tgs --> [DatabaseTable(TGS)])], could not be converted to [class [B].

org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)

org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)

org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)

javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

Exception [TOPLINK-3002] (Oracle TopLink Essentials - 2006.4 (Build 060412)): oracle.toplink.essentials.exceptions.ConversionException

Exception Description: The object [16,885], of class [class java.lang.Integer], from mapping [oracle.toplink.essentials.mappings.DirectToFieldMapping[filetg–>TGS.FILETG]] with descriptor [RelationalDescriptor(sample.datamap.Tgs --> [DatabaseTable(TGS)])], could not be converted to [class [B].

oracle.toplink.essentials.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:51)

oracle.toplink.essentials.internal.helper.ConversionManager.convertObjectToByteArray(ConversionManager.java:303)

oracle.toplink.essentials.internal.helper.ConversionManager.convertObject(ConversionManager.java:143)

oracle.toplink.essentials.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:162)

oracle.toplink.essentials.mappings.converters.TypeConversionConverter.convertDataValueToObjectValue(TypeConversionConverter.java:107)

oracle.toplink.essentials.mappings.foundation.AbstractDirectMapping.getAttributeValue(AbstractDirectMapping.java:336)

oracle.toplink.essentials.mappings.foundation.AbstractDirectMapping.valueFromRow(AbstractDirectMapping.java:700)

oracle.toplink.essentials.mappings.DatabaseMapping.readFromRowIntoObject(DatabaseMapping.java:1007)

oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildAttributesIntoObject(ObjectBuilder.java:266)

oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:506)

oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:436)

oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:406)

oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:372)

oracle.toplink.essentials.queryframework.ReportQueryResult.processItem(ReportQueryResult.java:187)

oracle.toplink.essentials.queryframework.ReportQueryResult.buildResult(ReportQueryResult.java:149)

oracle.toplink.essentials.queryframework.ReportQueryResult.(ReportQueryResult.java:77)

oracle.toplink.essentials.queryframework.ReportQuery.buildObject(ReportQuery.java:579)

oracle.toplink.essentials.queryframework.ReportQuery.buildObjects(ReportQuery.java:628)

oracle.toplink.essentials.queryframework.ReportQuery.executeDatabaseQuery(ReportQuery.java:776)

oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:609)

oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:677)

oracle.toplink.essentials.queryframework.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:731)

oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2211)

oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)

oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:909)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:342)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.getResultList(EJBQueryImpl.java:430)

sample.MenuAction.listAlunos(MenuAction.java:54)

sample.MenuAction.execute(MenuAction.java:161)

org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)

org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)

org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)

org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)

org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)

org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)

org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)

org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)

org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)

javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.


Apache Tomcat/5.5.17

rconrado

isso funciona:
update tgs set filetg = lo_import(‘D:/RCF - JDeveloper Best Practices.pdf’) where numero = ‘1999’

rconrado

Pessoal solucionei o problema.

Fiz o seguinte:

Na entity:

@NamedQueries({

@NamedQuery(name = tgporusername, query = SELECT o FROM Tgs o WHERE o.username = :user),

@NamedQuery(name = insertfile, query = UPDATE Tgs o SET o.filetg = :file WHERE o.numero = :user)		

})

// Deixei o campo como Integer, senão ao acessar a JSP ele dá o erro de conversão.
private Integer filetg;

NO ACTION:

tx.begin();
								Query qProd = em.createNamedQuery("insertfile");   
								qProd.setParameter("file",tgFile.getFileData());
								qProd.setParameter("user", tg.getNumero());
								qProd.executeUpdate();
								tx.commit();

é isso!!!

Não sei se foi a melhor solução mas funcionou. Apesar que não testei pegar o arquivo de volta, porque por incrivel que pareça, isso não será necessário no projeto. :wink:

Abraços,
Rafael

Criado 21 de novembro de 2007
Ultima resposta 22 de nov. de 2007
Respostas 3
Participantes 1