在我的项目中,我在一些实体中使用枚举。枚举将作为整数存储在数据库中。为实现这一点,我使用了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,我接受使用这些框架的任何答案。
答案 0 :(得分:4)
在阅读文档后(我本来应该更加小心),我注意到了:
ObjectTypeConverter必须按名称唯一标识,并且可以在类,字段和属性级别定义,并且可以在实体, MappedSuperclass 和可嵌入类。
我无法使用@Entity
(因为这需要一个表格)或@MappedSuperclass
(因为这没有意义)注释枚举,但@Embeddable
在一个办法。使用@Embeddable
标记枚举可以解决问题:
@Embeddable
@ObjectTypeConverter(...)
public enum ExampleEnum
...