JPA 枚举序数 vs 字符串

2022-08-31 20:26:59

可以使用以下任一方法在 JPA 中定义枚举

@Enumerated(EnumType.ORDINAL)

@Enumerated(EnumType.STRING)

我想知道这两个定义的优缺点是什么?

我听说ORDINAL比使用EclipseLink的STRING表现得更好(更快)。
这是真的吗?


答案 1

我总是去.STRING

速度很少是最重要的问题 - 可读性和可维护性更重要

我使用是因为手动检查数据库中的行要容易得多,但更重要的是,我可以做两件事,而不接触数据库,无法处理:STRINGORDINAL

  1. 我可以更改枚举的顺序
  2. 我可以在枚举列表的中间插入新的枚举

这两项更改都将更改数据库中已在使用的枚举的序号值,因此,如果您使用的是 , 则会中断现有数据。ORDINAL

如果更改枚举值(不常见),则处理它很简单:

UPDATE table SET enum_column = 'NEW_ENUM_NAME' where enum_column = 'OLD_ENUM_NAME';

答案 2

这可能更有效率,但这是次要的。有一些缺点:ORDINALORDINAL

  • 它在数据库中的可读性较差
  • 如果对枚举定义重新排序,则数据库将不一致。

使用,您无法重命名枚举。STRING

选择其中之一并在整个应用程序中使用它 - 保持一致。

如果你的数据库将被其他客户端/语言使用 - 使用,它更具可读性。STRING