Home » Eclipse Projects » EclipseLink » ObjectTypeConverter problems
ObjectTypeConverter problems [message #385448] |
Sat, 07 February 2009 21:34 |
Ari Meyer Messages: 136 Registered: July 2009 |
Senior Member |
|
|
using EclipseLink 1.0.2, Oracle 10.2
Hi,
Would anybody know why this converter annotation doesn't work (always
returning false for null values)? The field is a nullable VARCHAR2(1).
The possible values for the field should be "Y" or NULL, mapping to
true, or "N" for false.
@Column(name = "INACTIVE_IND")
@ObjectTypeConverter(
name="booleanConverter_N-false",
dataType=java.lang.String.class,
objectType=java.lang.Boolean.class,
conversionValues={
@ConversionValue(dataValue="N", objectValue="false")
},
defaultObjectValue="true")
@Convert("booleanConverter_N-false")
private boolean active;
.... while this one (on different entity with the same field definition,
though using 0 for false and 1/NULL for true) does?
@Column(name = "INACTIVE_IND")
@ObjectTypeConverter(
name="booleanConverter_0-false",
dataType=java.lang.String.class,
objectType=java.lang.Boolean.class,
conversionValues={
@ConversionValue(dataValue="0", objectValue="false")
},
defaultObjectValue="true")
@Convert("booleanConverter_0-false")
private boolean active;
I have several converter annotations working for similar boolean
conversions on other entities, both for null and non-null values. Both
the one that's failing and the one below it operate on materialized
views, so that can't be the problem. The only difference between the
views is that currently all of the "INACTIVE_IND" values for the problem
view are NULL.
If I change the field to use a Boolean type wrapper, I get an NPE for
null values.
I then wrote a Converter impl to do the same thing as a sanity check,
and it works fine:
public class BooleanConverter_N_false
implements Converter
{
public Object convertDataValueToObjectValue(
Object dataValue,
Session session)
{
return ((dataValue != null) && dataValue.equals("N")) ?
Boolean.FALSE :
Boolean.TRUE;
}
public Object convertObjectValueToDataValue(
Object objectValue,
Session session)
{
return (objectValue == Boolean.FALSE) ?
"N" :
null;
}
public void initialize(DatabaseMapping mapping, Session session)
{
}
public boolean isMutable()
{
return false;
}
}
This Converter impl will get me by fine, but I'm still baffled. Any ideas?
Thanks,
Ari
|
|
|
Re: ObjectTypeConverter problems [message #385449 is a reply to message #385448] |
Mon, 09 February 2009 15:43 |
|
This is occurring as the ObjectTypeConverter has special handling for null
values.
The defaultObjectValue does not handle null values. But perhaps it should
so feel free to log a bug for this. "defaultObjectValue" is only for if
you have legacy data that has other values than you have set, and want to
default these. The mapping has a nullValue that can be set for the value
for null, but there does not seem to be a way to set this through
annotations (please log a bug), you can set it using a
DescriptorCustomizer.
For null, the converter allows the conversion value for null to be set,
i.e. null=true, but there does not seem to be a way to set null through
annotations, maybe log a bug for this. You can set the conversion for
null in code.
In your converter you must translate each value, so you need to give the
value for "Y"="true", other if you write out true, you will not get "Y" in
the database.
---
James
http://www.nabble.com/EclipseLink---Users-f26658.html
James : Wiki : Book : Blog : Twitter
|
|
|
Re: ObjectTypeConverter problems [message #385452 is a reply to message #385449] |
Tue, 10 February 2009 22:04 |
Ari Meyer Messages: 136 Registered: July 2009 |
Senior Member |
|
|
Thanks a lot James -- restored my sanity. ;-) I confirmed that the one
other case I had with NULL values was one where
defaultObjectValue="false", so it just *happened* to show as correct in
my tests. When I changed it to defaultObjectValue="true" as a test, it
still returned false, confirming that the ObjectTypeConverter is not
handling it.
Regarding my converter code, my client preferred to see NULL for true
rather than "Y", which is why I had it like that (the data objects
happen to be views anyway, so they won't be written to).
I'll log a bug for this, and in the meantime switch to using custom
converters.
It would be nice if the Wiki were updated about this, since it says:
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Use_the_.40ObjectTypeConverter_Annotation
defaultObjectValue: Set the value of this attribute to the default
object value. Note that this argument is for dealing with legacy data if
the data value is missing.
I assumed this meant it was specifically meant for NULL ("missing")
values, but from what you said this is definitely not the case.
Thanks,
Ari
James wrote:
> This is occurring as the ObjectTypeConverter has special handling for
> null values.
>
> The defaultObjectValue does not handle null values. But perhaps it
> should so feel free to log a bug for this. "defaultObjectValue" is only
> for if you have legacy data that has other values than you have set, and
> want to default these. The mapping has a nullValue that can be set for
> the value for null, but there does not seem to be a way to set this
> through annotations (please log a bug), you can set it using a
> DescriptorCustomizer.
> For null, the converter allows the conversion value for null to be set,
> i.e. null=true, but there does not seem to be a way to set null through
> annotations, maybe log a bug for this. You can set the conversion for
> null in code.
>
> In your converter you must translate each value, so you need to give the
> value for "Y"="true", other if you write out true, you will not get "Y"
> in the database.
>
> ---
> James
> http://www.nabble.com/EclipseLink---Users-f26658.html
>
|
|
|
Re: ObjectTypeConverter problems [message #385743 is a reply to message #385452] |
Thu, 26 February 2009 21:48 |
Ari Meyer Messages: 136 Registered: July 2009 |
Senior Member |
|
|
Bug logged and will be addressed for 1.1:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=265597
Ari Meyer wrote:
> Thanks a lot James -- restored my sanity. ;-) I confirmed that the one
> other case I had with NULL values was one where
> defaultObjectValue="false", so it just *happened* to show as correct in
> my tests. When I changed it to defaultObjectValue="true" as a test, it
> still returned false, confirming that the ObjectTypeConverter is not
> handling it.
>
> Regarding my converter code, my client preferred to see NULL for true
> rather than "Y", which is why I had it like that (the data objects
> happen to be views anyway, so they won't be written to).
>
> I'll log a bug for this, and in the meantime switch to using custom
> converters.
>
> It would be nice if the Wiki were updated about this, since it says:
>
> http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Use_the_.40ObjectTypeConverter_Annotation
>
> defaultObjectValue: Set the value of this attribute to the default
> object value. Note that this argument is for dealing with legacy data if
> the data value is missing.
>
> I assumed this meant it was specifically meant for NULL ("missing")
> values, but from what you said this is definitely not the case.
>
> Thanks,
> Ari
>
> James wrote:
>> This is occurring as the ObjectTypeConverter has special handling for
>> null values.
>>
>> The defaultObjectValue does not handle null values. But perhaps it
>> should so feel free to log a bug for this. "defaultObjectValue" is
>> only for if you have legacy data that has other values than you have
>> set, and want to default these. The mapping has a nullValue that can
>> be set for the value for null, but there does not seem to be a way to
>> set this through annotations (please log a bug), you can set it using
>> a DescriptorCustomizer.
>> For null, the converter allows the conversion value for null to be
>> set, i.e. null=true, but there does not seem to be a way to set null
>> through annotations, maybe log a bug for this. You can set the
>> conversion for null in code.
>>
>> In your converter you must translate each value, so you need to give
>> the value for "Y"="true", other if you write out true, you will not
>> get "Y" in the database.
>>
>> ---
>> James
>> http://www.nabble.com/EclipseLink---Users-f26658.html
>>
|
|
|
Goto Forum:
Current Time: Thu Jan 23 15:18:11 GMT 2025
Powered by FUDForum. Page generated in 0.03659 seconds
|