Question

We have a project with some special requirements, one of wich is getting data from a XMLType database column from an Oracle 10g database.

We have found an easy solution using JDBC, but it would drive the application a little messy, as all the data access is being done through JPA (the implementation used is EclipseLink).

We have done some research, and have found some solutions, as using Converters and other auxiliar types, but the implementations seemed a little complicated.

So, my question is:
Could you recommend me an easy way to map an XMLType data column to a Java Object type, using JPA?

Thanks in advance.

Was it helpful?

Solution

Did you try just mapping it as a String?

In EclipseLink you can also map it using a DirectToXMLTypeMapping using a DescriptorCustomizer (no annotation support yet), or using the Converter as you have done.

OTHER TIPS

I think that it would be fine to share the full solution resulting from James' answer.

First, create a DescriptorCustomizer implmentation:

import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.mappings.xdb.DirectToXMLTypeMapping;

public class XMLDataCustomizer  implements DescriptorCustomizer {

    public void customize(final ClassDescriptor descriptor) throws Exception {
        descriptor.removeMappingForAttributeName("xmlField");
        DirectToXMLTypeMapping mapping = new DirectToXMLTypeMapping();
        mapping.setAttributeName("xmlField"); //name of the atribute on the Entity Bean
        mapping.setFieldName("XML_COLUMN"); //name of the data base column
        descriptor.addMapping(mapping);
    }

}

Then, all you have to do is use the @Customizer anotation on the entity, for the EntityManager to make use of it when handling the property called xmlField (as seen at the previous code snippet):

@Entity
@Table(name="TABLE_NAME")
@NamedQueries({ /* ... */})
@Customizer(XMLDataCustomizer.class)
public class DataEntity implements Serializable {
   /* ... */

   private String xmlField;

   /* .... */ 
}

The xmlField attribute does not need @Column anotation, as it's mapping is defined at our DescriptorCustomizer implementation.

And there is it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top