title: How to use enums with JPA
body: <p>I have an existing database of a film rental system. Each film has a has a rating attribute. In SQL they used a constraint to limit the allowed values of this attribute.</p>
  
  <pre><code>CONSTRAINT film_rating_check CHECK 
      ((((((((rating)::text = ''::text) OR 
            ((rating)::text = 'G'::text)) OR 
            ((rating)::text = 'PG'::text)) OR 
            ((rating)::text = 'PG-13'::text)) OR 
            ((rating)::text = 'R'::text)) OR 
            ((rating)::text = 'NC-17'::text)))
  </code></pre>
  
  <p>I think it would be nice to use a Java enum to map the constraint into the object world. But it's not possible to simply take the allowed values because of the special char in "PG-13" and "NC-17". So I implemented the following enum:</p>
  
  <pre><code>public enum Rating {
  
      UNRATED ( "" ),
      G ( "G" ), 
      PG ( "PG" ),
      PG13 ( "PG-13" ),
      R ( "R" ),
      NC17 ( "NC-17" );
  
      private String rating;
  
      private Rating(String rating) {
          this.rating = rating;
      }
  
      @Override
      public String toString() {
          return rating;
      }
  }
  
  @Entity
  public class Film {
      ..
      @Enumerated(EnumType.STRING)
      private Rating rating;
      ..
  </code></pre>
  
  <p>With the toString() method the direction enum -> String works fine, but String -> enum does not work. I get the following exception:</p>
  
  <blockquote>
    <p>[TopLink Warning]: 2008.12.09
    01:30:57.434--ServerSession(4729123)--Exception [TOPLINK-116] (Oracle
    TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))):
    oracle.toplink.essentials.exceptions.DescriptorException Exception
    Description: No conversion value provided for the value [NC-17] in
    field [FILM.RATING]. Mapping:
    oracle.toplink.essentials.mappings.DirectToFieldMapping[rating-->FILM.RATING]
    Descriptor: RelationalDescriptor(de.fhw.nsdb.entities.Film -->
    [DatabaseTable(FILM)])</p>
  </blockquote>
  
  <p>cheers </p>
  
  <p>timo</p>