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
Post a Comment