1

在我的项目中,我在某些实体中使用了枚举。枚举将作为整数存储在数据库中。为此,我使用 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,因此我接受使用这些框架的任何答案。

4

1 回答 1

4

在阅读文档后(我应该首先更仔细地做),我注意到:

ObjectTypeConverter 必须由名称唯一标识,并且可以在类、字段和属性级别定义,并且可以在EntityMappedSuperclassEmbeddable类中指定。

我不能用@Entity(因为这需要一个表格)或@MappedSuperclass(因为这没有意义)来注释枚举,但@Embeddable在某种程度上是有意义的。用标记枚举@Embeddable做了诀窍:

@Embeddable
@ObjectTypeConverter(...)
public enum ExampleEnum
...
于 2012-12-10T15:07:35.730 回答