On Friday 04 April 2008, Ignacio Andreu wrote:
> I review the conversation If you're using PostgreSQL, the actual
> InputStream / Reader don't have support for PostgreSQL, although if you've
> a good solution for Large Object in PostgreSQL please e-mail me.
>
>
> - Ignacio
>
> On Fri, Apr 4, 2008 at 7:16 PM, Ignacio Andreu <[EMAIL PROTECTED]> wrote:
> > Hi,
> >
> > The InputStream / reader support is not documented yet, I want to provide
> > some documentation soon.
> >
> >
> > BTW I sent a patch for the InputStream / Reader support a week ago, this
> > patch solves some bugs, Can you review and commit the patch? Thanks in
> > advance!!
> >
> >
> >
> >
> > On Fri, Apr 4, 2008 at 5:32 PM, Patrick Linskey <[EMAIL PROTECTED]>
> >
> > wrote:
> > > > > Additionally, note that OpenJPA 1.1.0-SNAPSHOT has support for
> > >
> > > fields
> > >
> > > > > of type InputStream; with this support, OpenJPA will never fully
> > >
> > > load
> > >
> > > > > the data into memory.
> > > >
> > > > I can see how this will work for readonly values, how about write
> > >
> > > ones?
> > >
> > > > Also looking in the 1.1.0 manual I can not find any reference to
> > >
> > > InputStream.
> > >
> > > I think it hasn't been documented yet. Take a look at
> > > InputStreamLobTest for an example.
> > >
> > > For write values, you simply assign the InputStream field to the
> > > stream that OpenJPA should read from when streaming to the database:
> > >
> > > @Entity
> > > public class Picture {
> > > @Persistent private InputStream data;
> > >
> > > public void streamContentsIntoDatabase(InputStream is) {
> > > data = is;
> > > }
> > >
> > > public InputStream streamContentsFromDatabase() {
> > > return is;
> > > }
> > > }
> > >
> > > -Patrick
> > >
> > > On Fri, Apr 4, 2008 at 6:57 AM, David Goodenough
> > >
> > > <[EMAIL PROTECTED]> wrote:
> > > > On Tuesday 01 April 2008, Patrick Linskey wrote:
> > > > > Or, even more simply:
> > > > >
> > > > > em.getTransaction().begin();
> > > > > Connection c = OpenJPAPersistence.cast(em).getConnection();
> > > >
> > > > Actually for what I need I need to cast this to a
> > >
> > > DelegatingConnection
> > >
> > > > and then get the PGConnection by casting its InnermostDelegate.
> > > > But yes, this works - thank you.
> > > >
> > > > > try {
> > > > >
> > > > > ...
> > > > > } finally {
> > > > > c.close(); // the connection is a wrapper; this decrements the
> > > > > reference count
> > > > > }
> > > > > em.getTransaction().commit();
> > > > >
> > > > > Additionally, note that OpenJPA 1.1.0-SNAPSHOT has support for
> > >
> > > fields
> > >
> > > > > of type InputStream; with this support, OpenJPA will never fully
> > >
> > > load
> > >
> > > > > the data into memory.
> > > >
> > > > I can see how this will work for readonly values, how about write
> > >
> > > ones?
> > >
> > > > Also looking in the 1.1.0 manual I can not find any reference to
> > >
> > > InputStream.
> > >
> > > > David
> > > >
> > > > > -Patrick
> > > > >
> > > > > On Mon, Mar 31, 2008 at 8:31 PM, Pinaki Poddar
> > > > > <[EMAIL PROTECTED]>
> > >
> > > wrote:
> > > > > > Hi,
> > > > > > Following should work:
> > > > > >
> > > > > >
> > > > > >
> > > > > > import javax.persistence.EntityManager;
> > > > > > import org.apache.openjpa.kernel.Broker;
> > > > > > import org.apache.openjpa.jdbc.kernel.JDBCStore;
> > > > > > import org.apache.openjpa.persistence.JPAFacadeHelper;
> > > > > > import java.sql.Connection;
> > > > > >
> > > > > > EntityManager em = emf.createEntityManager();
> > > > > > Broker broker = JPAFacadeHelper.toBroker(em);
> > > > > >
> > > > > > JDBCStore store = (JDBCStore)broker.getStoreManager();
> > > > > > Connection con = store.getConnection();
> > > > > >
> > > > > > David Goodenough-3 wrote:
> > > > > > > I need to get to the real JDBC Connection object so that I
> > > > > > > can
> > >
> > > do some
> > >
> > > > > > > processing using Postgresql extensions (in particular the
> > >
> > > LargeObject
> > >
> > > > > > > support). I do not expect OpenJPA to understand what I am
> > >
> > > doing, but
> > >
> > > > > > > I need to access the Connection object and I need what I do
> > > > > > > to
> > >
> > > be
> > >
> > > > > > > in the same transaction as that used by OpenJPA (so also it
> > >
> > > needs to
> > >
> > > > > > > be the same transaction).
> > > > > > >
> > > > > > > The manual suggests:-
> > > > > > >
> > > > > > > OpenJPAEntityManagerFactory kemf =
> > >
> > > OpenJPAPersistence.cast(emf);
> > >
> > > > > > > OpenJPAConfiguration conf = kemf.getConfiguration();
> > > > > > >
> > > > > > > on page 190, but kemf does not have a getConfiguration method
> > > > > > > according to Eclipse (using OpenJPA 1.0.2).
> > > > > > >
> > > > > > > The OpenJPAConfiguration javadoc is not much use either in
> > >
> > > that it
> > >
> > > > > > > does tell me where to get it from.
> > > > > > >
> > > > > > > Any ideas?
> > > > > > >
> > > > > > > David
> > > > > >
> > > > > > --
> > > > > > View this message in context:
> > >
> > > http://www.nabble.com/How-to-get-I-get-to-the-read-JDBC-Connection-obje
> > >ct
> > >
> > > > > >...-tp16400383p16401689.html Sent from the OpenJPA Users mailing
> > >
> > > list
> > >
> > > > > > archive at Nabble.com.
> > >
> > > --
> > > Patrick Linskey
> > > 202 669 5907
Actually it is even easier than I throught;
Postgresql provides BlobInputStream and BlobOutputStream classes which
do exactly what is needed.
So to write you do:-
DelegatingConnection conn =
(DelegatingConnection)OpenJPAPersistence.cast(em).getConnection();
try {
conn.setAutoCommit(false);
Connection c = conn.getInnermostDelegate();
if(c.isClosed()) throw new SQLException("innermost
delegate is closed");
PGConnection pgconn = (PGConnection)c;
LargeObjectManager lom = pgconn.getLargeObjectAPI();
long oid = lom.createLO();
LargeObject lo = lom.open(oid,
LargeObjectManager.WRITE);
OutputStream loos = lo.getOutputStream();
and now you can write to the OutputStream loos in the normal way.
and to read you:-
LargeObjectManager lom =
((PGConnection)conn).getLargeObjectAPI();
long oid = Long.parseLong(args[0]);
LargeObject lo = lom.open(oid);
InputStream lois = lo.getInputStream();
and you can read in the normal way.
David