From: Ugo C. <u....@cb...> - 2003-01-02 11:35:35
|
Gavin King wrote: > Ahhhh the > 4000 characters bit is where you start to need > the "for update" clause. We were wondering about that > earlier. I think you *could* make it work like this: > > s = sf.openSession(); > tx = s.beginTransaction(); > foo = new Foo(); > foo.setClob( Hibernate.createClob("") ); > s.save(foo); > tx.commit(); > s.close(); > > s = sf.openSession(); > tx = s.beginTransaction(); > foo = (Foo) s.load( Foo.class, foo.getId(), LockMode.UPGRADE ); > oracle.sql.CLOB clob = (oracle.sql.CLOB) foo.getClob(); > java.io.Writer pw = clob.getCharacterOutputStream(); > pw.write(content); > pw.close(); > tx.commit(); > s.close(); > > > Would you try that for me, please? Tried it and it *mostly* works. The only problem seems to be that Oracle apparently does not distinguish between zero-length strings and NULL, so if you initialize the CLOB with Hibernate.createClob(""), the actual database column is nullified and the subsequent getClob() call returns null, making the clob.getCharacterOutputStream() fail with a NPE. As a quick&dirty hack, I've changed createClob("") to createClob(" ") and everything seems to work ok. However, I was wondering if it is really necessary to open a new session. Couldn't we somehow reuse the former session? Ugo |