Mapping Oracle XMLType on JPA (EclipseLink)
-
09-10-2019 - |
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.
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.