Excel Document Mapping

Excel datastore support assumes that objects of a class are persisted to a particular "sheet" of an Excel spreadsheet. Similarly a field of a class is persisted to a particular "column" index of that "sheet". This provides the basis for Excel persistence.

When persisting a Java object to an Excel spreadsheet clearly the user would like some control over what worksheet a class is persisted to, and to what column number a field is persisted. DataNucleus provides extension metadata tags to allow this control. Here's an example, using JDO XML metadata

<jdo>
    <package name="org.datanucleus.samples.models.company">
        <class name="Person" detachable="true" table="People">
            <extension vendor-name="datanucleus" key="sheet" value="People"/>
            <field name="personNum" >
                <extension vendor-name="datanucleus" key="index" value="0"/>
            </field>
            <field name="firstName">
                <extension vendor-name="datanucleus" key="index" value="1"/>
            </field>
            <field name="lastName">
                <extension vendor-name="datanucleus" key="index" value="2"/>
            </field>
        </class>
    </package>
</jdo>

So we have two primary extensions in use.

  • The table defines the name of the worksheet to use for that class. As an alternative you could use the metadata "extension" key table .
  • index is specified for a field, and defines that field "personNum" will be persisted as the first column in the worksheet etc.

Here's the same example using JDO Annotations

@PersistenceCapable(table="People")
public class Person
{
    @Extension(vendorName="datanucleus", key="index", value="0")
    long personNum;

    @Extension(vendorName="datanucleus", key="index", value="1")
    String firstName;

    @Extension(vendorName="datanucleus", key="index", value="2")
    String lastName;
}

Here's the same example using JPA Annotations (with DataNucleus @Extension/@Extensions annotations)

@Entity
@Table(name="People")
public class Person
{
    @Identity
    @Extension(key="index", value="0")
    long personNum;

    @Extension(key="index", value="1")
    String firstName;

    @Extension(key="index", value="2")
    String lastName;
}


Relationships

Obviously a spreadsheet cannot store related objects directly since each object is a row of a particular spreadsheet table. DataNucleus gets around this by storing the String-form of the identity of the related object in the relation cell.