Search code examples
springjpaeclipselinkconverters

ObjectTypeConverter not found within persistence unit


In my project I use an enum in some entities. The enum is to be stored in the database as an integer. To achieve this I use EclipseLink's ObjectTypeConverter.

I'd like to use annotations since I use Spring to omit the persistence.xml. The annotation to configure the ObjectTypeConverter must be specified on an entity. I don't feel the need to specify the annotation on all classes that use this enum as this is redundant and not maintainable. Specifying it once on some entity would work but this doesn't make sense in an OOP design (or any design for that mater). A solution would be to annotate the enum with @ObjectTypeConverter, but this doesn't work since the enum isn't an entity.

Example that isn't working but would be ideal:

@Entity
public class ExampleEntity
{
    @Id
    private Long id;
    @Convert("exampleenum")
    private ExampleEnum ee;
}

@ObjectTypeConverter(name = "exampleenum", objectType = ExampleEnum.class, dataType = Integer.class,
    conversionValues =
        {
            @ConversionValue(objectValue = "A", dataValue = "100"),
            @ConversionValue(objectValue = "B", dataValue = "200"),
            @ConversionValue(objectValue = "C", dataValue = "300")
        })
public enum ExampleEnum
{
    A, B, C;
}

Example results in the following exception:

Exception Description: The converter with name [exampleenum] used with the element [field ee] in the class [class com.example.ExampleEntity] was not found within the persistence unit. Please ensure you have provided the correct converter name.

Since I'm using Spring, JPA and EclipseLink I accept any answer using these frameworks.


Solution

  • Upon reading the documentation (which I should have done more carefully in the first place) I noticed:

    An ObjectTypeConverter must be be uniquely identified by name and can be defined at the class, field and property level and can be specified within an Entity, MappedSuperclass and Embeddable class.

    I couldn't annotate the enum with @Entity (as this requires a table) or @MappedSuperclass (as this doesn't make sense), but @Embeddable would make sense in a way. Marking the enum with @Embeddable did the trick:

    @Embeddable
    @ObjectTypeConverter(...)
    public enum ExampleEnum
    ...