When persisting a Java object to an LDAP datastore clearly the user would like some control
over where and how in the LDAP DIT (directory information tree) we are persisting the object.
In general Java objects are mapped to LDAP entries and fields of the Java objects are mapped
to attributes of the LDAP entries.
The following Java types are supported and stored as single-valued attribute to the LDAP entry:
-
String, primitives (like int and double), wrappers of primitives (like java.util.Long),
java.util.BigDecimal, java.util.BigInteger, java.util.UUID
-
boolean and java.lang.Boolean are converted to RFC 4517 "boolean" syntax (TRUE or FALSE)
-
java.util.Date and java.util.Calendar are converted to RFC 4517 "generalized time" syntax
Arrays, Collections, Sets and Lists of these data types are stored as multi-valued attributes.
Please note that when using Arrays and Lists no order could be guaranteed and no duplicate values are allowed!
Here's an example using JDO XML MetaData:
<jdo>
<package name="org.datanucleus.samples.models.company">
<class name="Group" table="ou=Groups,dc=example,dc=com" schema="top,groupOfNames" detachable="true">
<field name="name" column="cn" primary-key="true" />
<field name="users" column="member" />
</class>
<class name="Person" table="ou=Users,dc=example,dc=com" schema="top,person,organizationalPerson,inetOrgPerson" detachable="true">
<field name="personNum" column="cn" primary-key="true" />
<field name="firstName" column="givenMame" />
<field name="lastName" column="sn" />
</class>
</package>
</jdo>
For the class as a whole we use the
table
attribute to set the
distinguished name
of the container under which to store objects of a type. So, for example, we are mapping all
objects of class Group as subordinates to "ou=Groups,dc=example,dc=com".
You can also use the extension "dn" to specify the same thing.
For the class as a whole we use the
schema
attribute to define the object classes
of the LDAP entry. So, for example, all objects of type Person are mapped to the
common "top,person,organizationalPerson,inetOrgPerson" object classes in LDAP.
You can also use the extension "objectClass" to specify the same thing.
For each field we use the
column
attribute to define the
LDAP attribute
that
we are mapping this field to. So, for example, we map the Group "name" to "cn" in our LDAP.
You can also use the extension "attribute" to specify the same thing.
Some resulting LDAP entries would look like this:
dn: cn=Sales,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: Sales
member: cn=1,ou=Users,dc=example,dc=com
dn: cn=1,ou=Users,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: 1
givenName: Bugs
sn: Bunny
Here's the same example using JDO Annotations:
@PersistenceCapable(table = "ou=Groups,dc=example,dc=com", schema = "top,groupOfNames")
public class Group
{
@PrimaryKey
@Column(name = "cn")
String name;
@Column(name = "member")
protected Set<Person> users = new HashSet<Person>();
}
@PersistenceCapable(table = "ou=Users,dc=example,dc=com", schema = "top,person,organizationalPerson,inetOrgPerson")
public class Person
{
@PrimaryKey
@Column(name = "cn")
private long personNum;
@Column(name = "givenName")
private String firstName;
@Column(name = "sn")
private String lastName;
}