在持久性单元中找不到ObjectTypeConverter

时间:2012-12-09 21:31:14

标签: spring jpa eclipselink converter

在我的项目中,我在一些实体中使用枚举。枚举将作为整数存储在数据库中。为实现这一点,我使用了EclipseLink的ObjectTypeConverter

我想使用注释,因为我使用Spring省略了persistence.xml。必须在实体上指定用于配置ObjectTypeConverter的注释。我觉得不需要在使用此枚举的所有类上指定注释,因为这是多余的并且不可维护。在某个实体上指定一次会起作用,但这在OOP设计(或该主题的任何设计)中没有意义。解决方案是使用@ObjectTypeConverter注释枚举,但这不起作用,因为枚举不是实体。

不起作用但理想的示例:

@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;
}

示例导致以下异常:

  

异常说明:在持久性单元中找不到与类[class com.example.ExampleEntity]中的元素[field ee]一起使用的名称为[exampleenum]的转换器。请确保您提供了正确的转换器名称。

由于我使用的是Spring,JPA和EclipseLink,我接受使用这些框架的任何答案。

1 个答案:

答案 0 :(得分:4)

在阅读文档后(我本来应该更加小心),我注意到了:

  

ObjectTypeConverter必须按名称唯一标识,并且可以在类,字段和属性级别定义,并且可以在实体 MappedSuperclass 可嵌入类。

我无法使用@Entity(因为这需要一个表格)或@MappedSuperclass(因为这没有意义)注释枚举,但@Embeddable在一个办法。使用@Embeddable标记枚举可以解决问题:

@Embeddable
@ObjectTypeConverter(...)
public enum ExampleEnum
...
相关问题