Hibernate @Enumerated(EnumType.STRING)持久化疑问:用枚举name还是toString?
Hibernate对接PostgreSQL枚举持久化:name() vs toString()
Hibernate默认情况下,是使用枚举的name()方法来完成与PostgreSQL的数据持久化映射,而非toString()方法。
核心细节
- 默认行为:当实体类中直接使用枚举类型且未做额外配置时,Hibernate会调用枚举的
name()方法获取其声明的常量名称(比如枚举Status.ACTIVE的name()返回"ACTIVE"),将这个字符串存入数据库;读取时则通过Enum.valueOf()方法,把数据库中的字符串转换回对应的枚举实例。name()是枚举类的final方法,无法被重写,因此这种映射方式稳定性高、不会因为枚举类的自定义修改而出现异常。 - 切换为
toString()的实现:如果业务需要用toString()的返回值来持久化枚举,可以通过自定义属性转换器实现:- 创建一个实现
AttributeConverter<YourEnum, String>的转换器类,在convertToDatabaseColumn方法中调用枚举的toString()获取值,在convertToEntityAttribute方法中根据字符串值匹配对应的枚举实例(需确保toString()返回值唯一)。 - 在实体类的枚举字段上添加
@Convert(converter = YourEnumConverter.class)注解,指定使用该转换器。
- 创建一个实现
- 注意事项:如果盲目依赖
toString(),一旦枚举类中重写的toString()返回值不唯一,或者后续修改了toString()的实现,会直接导致数据读取失败,因此非必要不建议替换默认的name()映射方式。
内容的提问来源于stack exchange,提问作者Uddhav Bhagat
相关产品推荐
相关产品推荐

