I have a problem reading Blob s in postgres ERROR: invalid large-object descriptor: 0 (in the log you see the spanish translation)
I am not sure if it is to do with hibernate, postgres or seam. What I wanted to do is download a file thats in a Blob. I wrote a test using pure jdbc and the Blob in the database can be read correctly as long as autocomit is set to false. There are other pages that say the problem happens when not in a transaction http://jira.jboss.com/jira/browse/JBPORTAL-575 http://archives.postgresql.org/pgsql-general/2004-09/msg00848.php http://archives.postgresql.org/pgsql-interfaces/2000-10/msg00004.php http://jdbc.postgresql.org/documentation/80/binary-data.html says You must access Large Objects within an SQL transaction block. You can start a transaction block by calling setAutoCommit(false). but I am using a stateful session bean with an extended persistent context also added em.joinTransaction(); just to make sure. In the log it shows that it is in a JTATransaction, does that mean that there is a JDBC Transaction to the database? Two related questions: Is what I am doing the best way to download a file? Another question I have is when writing the Blob I use Blob blob=Hibernate.createBlob(stream); but dont know if this requires that the whole file be in memory. If so how can I write it using an OutputStream thanks in advance Andy Bailey In the entity bean i have @Entity @Name("document") public class Document { private Blob content; @Lob @Basic(fetch = FetchType.EAGER) public Blob getContent() { return content; } public void setContent(Blob content) { this.content = content; } ... } @Stateful @Scope(SESSION) @Name("documents") public class DocumentsBean implements Serializable, Documents { @DataModel private List documentList; @DataModelSelection @In(required=false) @Out(required=false) private Document document; @PersistenceContext(type=EXTENDED) private EntityManager em; public void download() { //try to solve problem with blobs in postgres outside of transactions em.joinTransaction(); FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = ( HttpServletResponse ) context.getExternalContext().getResponse(); String fileName=document.getFileName(); String contentType=document.getContentType(); int read = 0; byte[] bytes = new byte[1024]; response.setContentType(contentType); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); InputStream is = null; OutputStream os = null; try { Blob blob=document.getContent(); is = blob.getBinaryStream(); os = response.getOutputStream(); while((read = is.read(bytes)) != -1){ os.write(bytes,0,read); } os.flush(); os.close(); } catch (Exception e) { logger.error("download "+document,e); } FacesContext.getCurrentInstance().responseComplete(); } Excerpt from the logs 2006-09-15 09:04:17,730 DEBUG [org.jboss.seam.contexts.Contexts] found in session context: documents 2006-09-15 09:04:17,730 DEBUG [org.jboss.seam.jsf.SeamVariableResolver] resolved name to seam component 2006-09-15 09:04:17,730 DEBUG [org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor] ++++ LongLivedSessionPropagationInterceptor 2006-09-15 09:04:17,730 DEBUG [org.hibernate.jdbc.JDBCContext] TransactionFactory reported no active transaction; Synchronization not registered 2006-09-15 09:04:17,730 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join 2006-09-15 09:04:17,730 DEBUG [org.hibernate.jdbc.JDBCContext] successfully registered Synchronization 2006-09-15 09:04:17,731 DEBUG [org.jboss.seam.contexts.Contexts] found in event context: document 2006-09-15 09:04:17,731 DEBUG [org.jboss.seam.Component] selected row: c cldc_mvm.pdf 130907 application/pdf 2006-09-15 09:04:17,731 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join 2006-09-15 09:04:17,731 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined 2006-09-15 09:04:17,800 DEBUG [org.jboss.seam.Component] instantiating Seam component: interpolator 2006-09-15 09:04:17,800 ERROR [com.hazlorealidad.sgi.control.DocumentsBean] download c cldc_mvm.pdf 130907 application/pdf java.io.IOException: java.sql.SQLException: ERROR: el descriptor de objeto grande no es vĂ¡lido: 0 at org.postgresql.largeobject.BlobInputStream.read(BlobInputStream.java:97) at java.io.InputStream.read(InputStream.java:164) at java.io.InputStream.read(InputStream.java:89) at com.hazlorealidad.sgi.control.DocumentsBean.download(DocumentsBean.java:139) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:56) at org.jboss.seam.interceptors.ValidationInterceptor.validateTargetComponent(ValidationInterceptor.java:64) at sun.reflect.GeneratedMethodAccessor444.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.seam.util.Reflections.invoke(Reflections.java:13) at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:90) at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:60) at org.jboss.seam.interceptors.OutcomeInterceptor.interceptOutcome(OutcomeInterceptor.java:21) at sun.reflect.GeneratedMethodAccessor443.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.seam.util.Reflections.invoke(Reflections.java:13) ... ] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces} 2006-09-15 09:04:17,910 DEBUG [org.jboss.seam.jsf.SeamExtendedManagedPersistencePhaseListener] committing transaction after phase: INVOKE_APPLICATION(5) 2006-09-15 09:04:17,910 DEBUG [org.jboss.seam.util.Naming] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces} 2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time cascades 2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] dirty checking collections 2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 2006-09-15 09:04:17,910 DEBUG [org.hibernate.pretty.Printer] listing entities: 2006-09-15 09:04:17,911 DEBUG [org.hibernate.pretty.Printer] com.hazlorealidad.sgi.model.Document{digital=false, dateRegistered=2006-09-15 09:03:53, length=130907, [EMAIL PROTECTED], controlled=true, contentType=application/pdf, external=false, id=23, version=1.0, fileName=cldc_mvm.pdf, dateModified=null, state=null, url=null, name=c} 2006-09-15 09:04:17,911 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection 2006-09-15 09:04:17,911 DEBUG [org.hibernate.jdbc.JDBCContext] TransactionFactory reported no active transaction; Synchronization not.. View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3971942#3971942 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3971942 _______________________________________________ jboss-user mailing list [email protected] https://lists.jboss.org/mailman/listinfo/jboss-user
