Unlimited String in JDO # DataNucleus? (H2 DB) - java

I need to store a pretty much unlimited String (document) and I won't be able to determine it's length. I know there is CLOB, but I couldn't find it's implementation in JDO, just JPA.
I tried that:
#Column(jdbcType="CLOB")
private String contents = "";
But when I run schema validation tool I receive:
An exception was thrown during the operation of SchemaTool. Please refer to the log for full details. The following may help : Incompatible data type for column SCENE.CONTENTS : was VARCHAR (datastore), but type expected was CLOB (metadata). Please check that the type in the datastore and the type specified in the MetaData are consistent.
I must be missing something basic...

You couldn't find CLOB in JDO ? JDO allows you to define "jdbc-type", so you have the full range of types. In JPA you have a very limited set

Related

Store a big String in database?

What is the best way to store a a big String in SQL server Database.
I'm using varchar(8000) but I get this exception while persisting my Object using Hibernate :
>Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: String or binary data would be truncated.
Which version of SQL Server are you using? If the version is above 2005 Use VARCHAR(MAX). If the version is before 2005 you can use TEXT
When you want to store a very big string on SQL Server you can use:
varchar(max)
Well as I can see the tag of hibernate you need the tag of #Lob for storing super large objects.
Specifies that a persistent property or field should be persisted as a
large object to a database-supported large objec
Example:
#Lob #Basic(fetch=LAZY)
#Column(name="REPORT")
protected String report;
From Hibernate Docs.

What data types to store db2 xml in java?

I have a requirement to get XML data stored in db2. In db2 the XML data is stored in a table column whose type is XML (db2).
Now if i have to retrieve it using plain JDBC (no other choice i have here), what is the java data type in which this should be mapped.
From what i researched, i feel it should be this way.
String xmlData = (String) resultSet.getObject(1);
(assuming 1 is the column index where the xml data is stored)
Is this a viable solution? Any suggestions?
ResultSet has getSQLXML(int) which returns a java.sql.SQLXML object.
SQLXML gives you the most options to access the XML data.
Anyway you have a wide variety of options to retrieve the XML.
According this doc you can simply use ResultSet.getString(int) if you want the data as String.
But as always it depends on the version of your DB2 and your JDBC driver if all these options are supported.

ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column

I'm getting following exception, while updating table in Hibernate
ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column
I have extracted sql query as well, it looks like
Update table_name set columnName (LOB)=value, colmun2 (String with 4000)=value where id=?;
Entity class
class Test{
#Lob
private String errorText;
#Column(length = 4000)
private String text;
}
Please help me, what is wrong in this
Thanks
Ravi Kumar
Running oerr ora 24816 to get the details on the error yields:
$ oerr ora 24816
24816, ... "Expanded non LONG bind data supplied after actual LONG or LOB column"
// *Cause: A Bind value of length potentially > 4000 bytes follows binding for
// LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
// at the end of the bind list.
So another solution that uses only 1 query would be to move your LOB/LONG binds after all your non-LOB/LONG binds. This may or may not be possible with Hibernate. Perhaps something more like:
update T set column2 (String with 4000)=:1, columnName (LOB)=:3 where id=:2;
This DML limitation appears to have been around since at least Oracle 8i.
References:
http://openacs.org/forums/message-view?message_id=595742
https://community.oracle.com/thread/417560
I do realise that this thread is quite old, but I thought I'd share my own experience with the same error message here for future reference.
I have had the exact same symptoms (i.e. ORA-24816) for a couple of days. I was a bit side-tracked by various threads I came across suggesting that this was related to order of parameter binding. In my case this was not a problem. Also, I struggled to reproduce this error, it only occurred after deploying to an application server, I could not reproduce this through integration tests.
However, I took a look at the code where I was binding the parameter and found:
preparedStatement.setString(index, someStringValue);
I replaced this with:
preparedStatement.setClob(index, new StringReader(someStringValue));
This did the trick for me.
This thread from back in 2009 was quite useful.
I found issue.
1. When hibernate updating data in DB and entity has 4000 chars column and lob type column then hibernate throwing this exception
I have solved this issue by writing two update queires
1. First i have saved entity by using Update()
2. Written another update query for lob column update
Thanks
ravi
I have also encountered same error in oracle db and foudn that Hibernate Guys fixed here
In my case we were already using hiberante 4.3.7 but didnt mention that field is Lob in Entity
Reproducing Steps
Have fields with varchar2 datatype and clob data type.Make sure your column name are in this alphabetic order clob_field,varchar_two_field1,varchar_two_field2.
Now update clob_field with < 2000 bytes and varchar_two_field1 with 4000 bytes size.
This should end up with error ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column
Solution
Make sure you have hiberante 4.1.8, < 4.3.0.Beta1
Annotate your clob/blob field in respective Entity as
import javax.persistence.Lob;
...
#Lob
#Column(name = "description")
private String description;
....
If you want to see the difference , by after making above changes enable debug for sql statements by setting "true" for "hibernate.show_sql" in persistence.xml.
I came across this issue today while trying to Insert the data into a table. To avoid this error, Just keep all the fields having "LOB" data type at the end of the insert statement.
For Example
Table1 has 8 Fields (Field1,Field2,.... Field8 etc..),
of which
Field1 and Field2 are of CLOB data types
and the rest are Varchar2 Data types
. Then while inserting the data make sure you keep Field1 and Field2 values at the end like below.
INSERT INTO TABLE1 ( Field3,Field4,Field5,Field6,Field7,Field8,Field1,Field2)
Values ('a','b','c','d','e','f','htgybyvvbshbhabjh','cbsdbvsb')
Place your LOB binding at the last. See if that solves the issue..

Oracle schema validator

I'm using Oracle DB in my application
My Application allow the user to create schema and for that reason
I want to do some validation before my application is set up..
for example I want to make sure that the user didn't create table with long column name
(There is limitation in Oracle for max 30 bytes table and column name)
I holding Dialect object in my validation function ,
Is it possible using the dialect object to find out that the user input (in my example column name)
is not correct - (because the column name size is more than 30 bytes..)
please assist,
Thanks,
Jhon.
I found out how to do it ..
I declared new object of class : java.sql.DatabaseMetaData
in This class there is getMaxColumnNameLength() method which return the limit for each DB
(for example in oracle that method return 30)
and now I can do my validation!
Thanks anyway :)
John.

cannot get clob datatype from database into JPA entity

I able to save (spring-hibernate saveorupdate()) field
#Lob
#Column(name = "FILENAME")
private String filename;
into oracle database datatype is clob
but when i try retrieve it, i get error
ERROR -
JDBCExceptionReporter.logExceptions(72)
| ORA-00932: inconsistent datatypes:
expected - got CLOB
below is how i retrive from database
DetachedCriteria crit = DetachedCriteria.forClass(Storagefile.class);
crit.addOrder(bSortOrder ? Order.asc(sortColumnId) : Order.desc(sortColumnId));
List<Storagefile> result = (List<Storagefile>) getHibernateTemplate().findByCriteria(crit, nFirst, nPageSize);
It's not clear from your sample code, but my guess is that you're trying to sort by the CLOB column, and Oracle does not permit that. That error code is Oracle's charming way of telling you this.
Are you sure you need to use a CLOB to store a filnename? Oracle can store up to 4000 characters in a VARCHAR2 column, surely that's enough for a filename? If you want to sort by the filename, then that's what you'll need to do.
Have you waded through this:
https://www.hibernate.org/56.html
There seems to be an issue with the Oracle 9i driver and LOBs (not sure what your setup is).

Categories