postgresql - Mapping Java enum on Postgres enum with EclipseLink -


i making first attempts jpa (eclipselink implementation) , feel quite stuck:

in postgresql have following db schema

create type mood enum ( 'sad', 'happy', 'enthusiastic' );  create table person (   pk      bigint   primary key,   name    varchar  not null,   mood    mood     not null );  create sequence person_pk_seq increment 100 minvalue 100; 

which works pretty fine, insert shows insert person (pk, mood, name) values (3, 'happy', 'joe') (committing pk string makes no difference.)

on jpa side wrote following class:

package testdb; import java.io.serializable; import javax.persistence.*; import org.eclipse.persistence.annotations.*;  @entity public class person implements serializable {   private static final long serialversionuid = 1l;    public enum mood {     sad, happy, enthusiastic;   }    @id   @sequencegenerator(     name="person_pk_generator",     sequencename="person_pk_seq",     allocationsize = 100   )   @generatedvalue(     strategy=generationtype.sequence,     generator="person_pk_generator"   )   public long pk;    @enumerated( enumtype.string )   @column( name = "mood" )   @objecttypeconverter( name = "moodconverter", objecttype = mood.class,     datatype = string.class, conversionvalues = {       @conversionvalue( objectvalue = "sad", datavalue = "sad" ),       @conversionvalue( objectvalue = "happy", datavalue = "happy" ),       @conversionvalue( objectvalue = "enthusiastic", datavalue = "enthusiastic" )   })   @convert( "moodconverter" )   public mood mood;    @column( name = "name" )   public string name;    public static void main(string[] args) {     entitymanagerfactory factory = persistence.createentitymanagerfactory("testdb.jpa.tests" );     entitymanager em = factory.createentitymanager();      em.gettransaction().begin();     person p = new person();     em.persist( p );     system.out.println(p.pk);     p.name = "joe";     p.mood = mood.enthusiastic;     em.gettransaction().commit();      query q = em.createquery( "select p person p" );     person x = (person)q.getresultlist().get(0);     system.out.println( x.pk + " :: " +x.mood );      em.close();   } } 

however, example not working , have no clue problem is:

[el warning]: 2012-06-05 15:28:20.646--unitofwork(845463623)--exception [eclipselink-4002] (eclipse persistence services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.databaseexception internal exception: java.sql.batchupdateexception: batch-eintrag 0 insert person (pk, mood, name) values ('801', 'enthusiastic', 'joe') wurde abgebrochen.  rufen sie 'getnextexception' auf, um die ursache zu erfahren. error code: 0 call: insert person (pk, mood, name) values (?, ?, ?)     bind => [3 parameters bound] 

when alter column type of table person varchar , remove annotations @convert , @objecttypeconverter working expected, well.

any ideas?

why use @objecttypeconverter, can map enumerations out of box eclipse link shown here. @enumerated part of jsr-220 whereas @objecttypeconverter proprietary extension eclipselink jpa extensions.

@enumerated(enumtype.string) @column(name = "mood") private mood mood; 

Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -