+

Search Tips   |   Advanced Search

Mapping persistent properties to XML columns


If the database supports XML column types, we can use mapping tools to manage XML objects. The Java Persistence API (JPA) spec does not contain support for mapping XML columns to Java objects. we have the choice of mapping XML columns to a Java string or a Java byte array field. These mapping techniques make using the XML objects as strings or byte arrays difficult. JPA for the appserver allows you to simplify the management of XML objects by using a third-party solution for mapping management.

DB2, Oracle, and SQLServer databases support XML column types, XPath queries, and indices over these columns.

Persistent properties to XML mapping

An embedded class with XML column support needs to use XML marshalling to write the data to the XML column and unmarshalling to retrieve the data from the XML column. The path expressions and predicates over the embedded class are converted to XML predicates, XPATH expressions, or XQuery expressions and are written to the database.

WAS allows JPA applications to use a third-party tool for XML mapping. This is done through the extension points for custom field mappings. The third-party mapping tool uses the extension points by providing a custom value handler for the persistent fields that are mapped to the XML columns. In OpenJPA, this value handler is named org.apache.openjpa.xmlmapping.XmlValueHandler and this handler requires the @Strategy annotation on the Java field that is mapped to the XML column.

 

  1. Annotate the entity property using the XML value handler strategy.

    The mapping of persistent properties to XML columns requires the @Strategy and the @Persistent annotation.

    @Persistent
    @Strategy("org.apache.openjpa.xmlmapping.XmlValueHandler")
    

    The XML value handler for the persistent property is set to org.apache.openjpa.xmlmapping.XmlValueHandler.

  2. Change the default for fetch type if it is necessary. For example:

    @Persistence(fetch=FetchType.LAZY)
    
    

    The fetch type is now LAZY. If a value for the fetch type is not entered, the default is set to EAGER.

  3. Annotate the embedded classes with the binding annotations for Java API for XML Binding (JAXB). These bindings can be created from an XML schema by using the Java Architecture for XML Binding Compiler (XJC).

  4. Make sure that the class that maps to the root of the XML document is annotated with @XmlRootElement, in addition to the other annotations.

  5. Compile the Java sources.

  6. Run the enhancer tool on the entities. Refer to the topic on the entity enhancer tool for more information.

 

Example

For example, shipAddress, a property of Order Entity, is mapped to XML column shipaddr:

@Entity public class Order {
  @Id 
  @GeneratedValue(strategy=GenerationType.IDENTITY)
   int oid;
  @Persistent
  @Strategy("org.apache.openjpa.xmlmapping.XmlValueHandler")
      @Column(name="shipaddr")
      Address shipAddress;
…

The OpenJPA mapping tool generates a SHIPADDR column with XML type in the table definition for ORDER table.

 

Related tasks


Develop and packaging JPA applications for a Java EE environment
Develop and packaging JPA applications for a Java SE environment

 

Related


wsenhancer