如果您曾经在JPA中使用过Java枚举,那么您肯定会意识到它们的局限性和陷阱。 使用enum
作为@Entity
的属性通常是一个很好的选择,但是2.1之前的JPA不能很好地处理它们。 它给了您2 + 1个选择:
-
@Enumerated(EnumType.ORDINAL)
(默认值)将使用Enum.ordinal()
映射enum
值。 基本上,第一个枚举值将在数据库列中映射为0
,第二个映射为1
,依此类推。这非常紧凑,并且在要修改枚举时非常有用。 在中间删除或增加值或重新排列它们将完全破坏现有记录。 哎哟! 更糟糕的是,单元测试和集成测试通常在干净的数据库上运行,因此它们不会发现旧数据之间的差异。 -
@Enumerated(EnumType.STRING)
更安全,因为它存储enum
字符串表示形式。 现在,您可以安全地添加新值并移动它们。 但是,重命名Java代码中的enum
仍会破坏DB中的现有记录。 更重要的是,这种表示非常冗长,不必要地消耗了数据库资源。 - 您还可以使用原始表示形式(例如single
char
或int
),并在@PostLoad
/@Pre