ClassCastException causes a logging statement to throw another ClassCastException upon
inconsistent instantiation of NullableType
---------------------------------------------------------------------------------------------------------------------------------
Key: HHH-2490
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2490
Project: Hibernate3
Type: Bug
Components: core
Versions: 3.2.2
Environment: MS SQLServer
Windows 2000
Java 1.5.0_10
Reporter: Øyvind Roth
(Have me excused that I don't know well the internalities of Hibernate,
but I think that you get the point from some kind of "bird's perpective"
anyhow).
My pojo is defined in my xml mapping with a column/field as follows:
...
<property name="encrypted"
type="string"
column="encrypted"
insert="true"
update="true"
not-null="true"/>
...
The corresponding POJO class is defined with two access methods:
String getEncrypted();
and
boolean isEncrypted();
The field is a String with possible values "f" or "t".
Of convenience reasons I have added a parallell method
operating on boolean. My database is designed with a CHAR(1)
for booleans. (All this because the dam... RDBMS standard doesn't
advice a consistent boolean data type, a really big blunder from
time back in System R. OT ok, but I got it out.)
When Hibernate parses my instantiated pojo, a Boolean instance is
generated. But it's "repository" is prepared with a StringType as a
consequence of my XML configuration file. During the course, the
method nullSafeSet of class NullableType is called with the value
parameter Boolean. Eventually the
"public abstract String toString(Object value) throws HibernateException;"
method is called for StringType, which is implemented with a simple typecast.
Exception received. Whether this behavior is ok or not is one discussion.
But there's a second problem to it also: When the exception is received,
NullableType tries to log the event:
...
catch ( RuntimeException re ) {
log().info( "could not bind value '" + nullSafeToString( value ) +
"' to parameter: " + index + "; " + re.getMessage() );
throw re;
}
...
And the same shit happens again. So the developer does not receive the actual exception,
but the exception received from the logging statement. A strong golden rule of thumb:
A logging statement should never ever throw. This is what I would call a bug in
Hibernate.
Setting the log level to ERROR will of course not solve the problem,
because the string paramater is evaluated before the log statement is ever reached.
A variant of this issue is described under: "HHH-2034"
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira