Enviar o foto no hibernate - não funciona

6 respostas
jsnpereira

Olá, pessoal!

Enviar o foto no hibernate ocorreu erro. veja em baixo

mensagem de erro

Erro: could not insert: [Persistencia.Arquivos]
org.hibernate.exception.DataException: could not insert: [Persistencia.Arquivos]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:100)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546)
	at Controlador.IncluirArquivos.doPost(IncluirArquivos.java:80)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'arquivo' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2939)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 30 more

Servlet incluir foto

@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		boolean isMultiplad = ServletFileUpload.isMultipartContent(request);
		
		System.out.println(isMultiplad);
		
		Arquivos ar = new Arquivos();
		
		if(isMultiplad){
			FileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);
			List<FileItem> itens = null;
			try {
				itens = (List<FileItem>) upload.parseRequest(request);
				System.out.println("tam: "+itens.size());
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			SessionFactory sf = (new AnnotationConfiguration().configure("/cfg/hibernate.cfg.xml")
					.buildSessionFactory());
			Session sessao = sf.openSession();
			Transaction tx = null;
			try {
				tx = sessao.beginTransaction();
				for(FileItem item : itens){
					System.out.println(item.isFormField());
					if(item.isFormField()){
						System.out.println("Desc: "+item.getString());
						ar.setDesc(item.getString());
					} else {
						System.out.println("Tam: "+item.get());
						ar.setArquivo(item.get());	
					}
				}
				sessao.save(ar);
				tx.commit();
				
			} catch (HibernateException e) {
				tx.rollback();
				System.out.println("Erro: "+e.getMessage());
				e.printStackTrace();
			} finally {
				sessao.close();
			}
			System.out.println("Enviando a arquivo com sucesso");
		}
	}

Classe Arquivo

@Entity
public class Arquivos {
	@Id
	@GeneratedValue
	private int id;
	@Column(name="descricao")
	private String desc;
	@Column(name="arquivo")
	private byte[] arquivo;
	//Getters e Setters

Já tentamos várias vezes para encontrar essa situação… espero que vcs me ajudem a corrigir… obrigado!!

6 Respostas

gigicantador

O ‘caused by’ mostra que a coluna do banco não esperava um dado tão grande. Eu iniciaria a investigação pelo banco…

jsnpereira

Tem que verificar os códigos da Classe Arquivo ou anotação da Hibernate, ou da Servlet para corrigir alguns para funcionar… tentei até não encontrei para resolver essa situação

gigicantador

Não… O banco de dados mesmo. Checa se a coluna do banco em que você está tentando gravar o arquivo suporta o mesmo.
Digo isto pois o erro parece ser inconformidade entre o banco e o que você está mandando pra ele.

dcorteztec

A dica é essa:
Para persistir um array de bytes tem q ser um campo @Lob

@Lob
@Column(name="arquivo")  
private byte[] arquivo;
jsnpereira

dcorteztec:
A dica é essa:
Para persistir um array de bytes tem q ser um campo @Lob

@Lob
@Column(name="arquivo")  
private byte[] arquivo;

Agora estou tentando para testar a funcionar esse que vc disse mas ocorreu problema tomcat veja o forum que postei.
http://www.guj.com.br/java/240099-problema-tomcat#1238812

Obrigado!

jsnpereira

jsnpereira:
dcorteztec:
A dica é essa:
Para persistir um array de bytes tem q ser um campo @Lob

@Lob
@Column(name="arquivo")  
private byte[] arquivo;

Agora estou tentando para testar a funcionar esse que vc disse mas ocorreu problema tomcat veja o forum que postei.
http://www.guj.com.br/java/240099-problema-tomcat#1238812

Obrigado!

Acabei de conseguir a funcionando a enviar o arquivo… muito obrigado!!!

Criado 27 de abril de 2011
Ultima resposta 28 de abr. de 2011
Respostas 6
Participantes 3