I don't have much background on the technologies below so any help would be appreciated. Please feel free to ask questions if something's not clear.
I'm currently working on a migration project wherein we're updating a number of technologies including:
- Sybase - from 12.x to 15.7
- JConnect - from several versions to 7.0.7_SP130
Now, our apps are deployed on to JBoss 4.x and use Hibernate 3.2.4.sp1. In the old DB, we have a number of custom datatypes that look something like this (sorry, would have loved to put this in table format, but I don't know how to here...) :
- Custom datatype: TYPE1, Base datatype: image
- Custom datatype: TYPE2, Base datatype: tinyint
Some columns in our DDL use the custom datatypes:
CREATE TABLE y (
our_column_name TYPE1,
...
);
When the server is started up, I get the following error message:
... javax.persistence.PersistenceException: org.hibernate.HibernateException: Wrong column type: our_column_name, expected: image
which is not what happens in the old setup. Do take note that of all the custom datatypes we've defined, only those with image and tinyint have issues; the others are recognized and throw no error.
We've run a trace on the JConnect driver and it appears that it's retrieving the correct datatype, which is why I'm now focusing on the HibernateException. I've seen a couple of posts similar to this one (occurring on different DBs), but basically, they gave similar workarounds:
One site like this one, it's suggested that we alter the DB table's column to use the base datatype instead of the custom datatype. We've done this by changing our_column_name's datatype to
image
. Once this was done and the server was restarted, the error goes away. However, it does not explain why or what caused the issue.This suggested the use of JPA annotations'
@Column(columnDefinition='image')
. We've tried this as well, but it doesn't seem to have any effect on the startup (i.e. error still occurred).In the same link as #2, it was suggested that the SQL Dialect be extended. However, I don't think this is feasible - only 2 custom datatypes (image and tinyint) seem to be causing the problems on our end so this may be overkill.
This site suggests the removal of
hibernate.hbm2ddl.auto=validate
from persistence.xml. Have not tried this as we need the validation to be in place.Use the datatype "LOB" instead
I've also tried checking out Hibernate's code since the exception was thrown here - org.hibernate.mapping.Table.validateColumns(Table.java:261)
, which pretty much points to this line:
boolean typesMatch = (col.getSqlType(dialect, mapping).startsWith(columnInfo.getTypeName().toLowerCase())) || (columnInfo.getTypeCode() == col.getSqlTypeCode(mapping));
However, Hibernate's API documentation is a little wanting in details so I'm having some difficulty in tracing this at the moment...
Any ideas on what's causing the exception? If it's working in the old version, was wondering on what changes in Hibernate (or Sybase for that matter) can cause this?
This document suggests that Hibernate is tested against Sybase 15.7 so I'm at a loss where to continue looking. And would #1 above be the best workaround? If so, any ideas why base types should be used instead of custom datatypes (which would, in essence, render custom datatypes useless...)
Thanks again in advance!
EDIT:
Tried the following:
- If
@Column(columnDefinition='my_custom_datatype')
is used, then the error goes away. - If
hibernate.hbm2ddl.auto=validate
is removed from persistence.xml, the error goes away.
I'm really suspecting it's a hibernate issue...