|  |  |  | License Codehaus OpenEJB OpenJMS OpenORB Tyrex

Old releases
General
Release 1.3
Release 1.3rc1
Release 1.2

Main
Home
About
Features
Download
Dependencies
Reference guide
Publications
JavaDoc
Maven 2 support
Maven 2 archetypes
DTD & Schemas
Recent HTML changes
News Archive
RSS news feed
Project Wiki

Development/Support
Mailing Lists
SVN/JIRA
Contributing
Support
Continuous builds
Prof. services

Related projects
Spring ORM support
Spring XML factories
WS frameworks

XML
XML

XML Code Generator
XML Code Generator

JDO
Introduction
First steps
Using JDO
JDO Config
Types
JDO Mapping
JDO FAQ
JDO Examples
JDO HOW-TOs
Tips & Tricks
Other Features
JDO sample JAR

Tools
Schema generator

Advanced JDO
Caching
OQL
Trans. & Locks
Design
KeyGen
Long Trans.
Nested Attrs.
Pooling Examples
LOBs
Best practice

DDL Generator
Using DDL Generator
Properties
Ant task
Type Mapping

More
The Examples
3rd Party Tools
JDO Tests
XML Tests
Configuration

About
License
User stories
Contributors
Marketplace
Status, Todo
Changelog
Library
Contact
Project Name

## How to map typesafe enumerations with Castor

Intended Audience
Prerequisites
Steps
Tips

## Intended Audience

Anyone who wants to persist object that refer to a typesafe enumeration.

This document addresses the basics and shows an example how to map an object that has a typesafe enumeration property.

## Prerequisites

Enumerations are a common method for ensuring data integrity, both in software and in relational databases. As a platform for linking the two, we added support for persisting class fields whose type is a Java typesafe enumeration to Castor JDO.

To use this new feature your typesafe enumeration should follow the enum pattern commonly used and provide a `static valueOf(String)` method. An enum of different kinds of computer equipment may look like:

    public class KindEnum {
        private static final Map KINDS = new HashMap();

        public static final KindEnum MOUSE = new KindEnum("Mouse");
        public static final KindEnum KEYBOARD = new KindEnum("Keyboard");
        public static final KindEnum COMPUTER = new KindEnum("Computer");
        public static final KindEnum PRINTER = new KindEnum("Printer");
        public static final KindEnum MONITOR = new KindEnum("Monitor");

        private final String _kind;

        private KindEnum(final String kind) {
            _kind = kind;
            KINDS.put(kind, this);
        }

        public static KindEnum valueOf(final String kind) {
    	    return (KindEnum) KINDS.get(kind);
        }

        public String toString() { return _kind; }
    }

At your Product class you may want to have a property that tells you what kind of computer equipment a product is of.

    public class Product {
        private int         _id;
        private String      _name;
        private KindEnum    _kind;

        public Product() { }

        public int getId() { return _id; }
        public void setId(int id) { _id = id; }

        public String getName() { return _name; }
        public void setName(String name) { _name = name; }

        public KindEnum getKind() { return _kind; }
        public void setKind(KindEnum kind) { _kind = kind; }
    }

## Steps

Your mapping for the Product class should be:

    <class name="Product" identity="id">
      <description>Product with kind enum</description>
      <map-to table="enum_prod"/>
      <field name="id" type="integer">
        <sql name="id" type="integer"/>
      </field>
      <field name="name" type="string">
        <sql name="name" type="char"/>
      </field>
      <field name="kind" type="KindEnum">
        <sql name="kind" type="char"/>
      </field>
    </class>

## Tips

-

To add this new feature we added an additional check when searching for field types. Like before Castor first searches for know types and thereafter for a mapping for the class you specified as type. If both of them do not match it now checks if the class specified as type is available at classpath and has a static valueOf(String) method. Only if all of this conditions are met it will be viewed as a valid mapping.

<notice> Copyright © 1999-2005 ExoLab Group, Intalio Inc., and Contributors. All rights reserved. </notice>
<notice> Java, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and in other countries. XML, XML Schema, XSLT and related standards are trademarks or registered trademarks of MIT, INRIA, Keio or others, and a product of the World Wide Web Consortium. All other product names mentioned herein are trademarks of their respective owners. </notice>