休眠如何在属性上使用String.intern

Han*_*örr 5 java hibernate

对于某些实体,我们需要将成千上万个独立实体的负载永久保存在内存中。它们的许多属性来自一组有限的字符串(尽管不足以将其放入枚举中)。休眠是否可以将String.intern用于这些属性以节省空间?

理想情况下,这应该通过注释来实现,我可以在每个属性上加上一些容易更改的属性,而不会因实现问题而使源代码过于混乱。

Per*_*uss 4

正如您自己所建议的,使用 JPA 属性转换器完全可以做到这一点。autoApply = true您可以通过使用转换器在一般级别上执行此操作,也可以使用@Convert注释在逐个字段级别上执行此操作。

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class StringInternConverter implements AttributeConverter<String, String> {
    @Override
    public String convertToDatabaseColumn(String attribute) {
        return attribute;
    }

    @Override
    public String convertToEntityAttribute(String dbData) {
        return dbData != null? dbData.intern(): null;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 Hibernate 5.2.10 进行测试,效果非常好!