Java Spring Hibernate中实体字段的本地化

Java Spring Hibernate中实体字段的本地化,java,spring,hibernate,spring-boot,internationalization,Java,Spring,Hibernate,Spring Boot,Internationalization,我有两个实体,其中有我想要本地化的字段。然而,我不知道如何正确地实现它,因为我需要一个对实体的引用以及对被翻译字段的引用,以便有一个共享的“i18n”表 是否有一种特定的方法可以在Spring中实现实体字段的国际化,或者至少有某种解决方法可以使其在没有太多开销的情况下工作 编辑 我写了一篇关于如何使用XmlAnyAttribute解决这个问题的短文,我做了一些研究,发现了这个JPA注释。您需要将name和description属性封装到一个对象(实现AttributeConverter)中,并使

我有两个实体,其中有我想要本地化的字段。然而,我不知道如何正确地实现它,因为我需要一个对实体的引用以及对被翻译字段的引用,以便有一个共享的“i18n”表

是否有一种特定的方法可以在Spring中实现实体字段的国际化,或者至少有某种解决方法可以使其在没有太多开销的情况下工作

编辑


我写了一篇关于如何使用XmlAnyAttribute解决这个问题的短文,我做了一些研究,发现了这个JPA注释。您需要将name和description属性封装到一个对象(实现AttributeConverter)中,并使用转换类指定在持久化时如何转换它,以及在检索时如何转换它

要在持久性和检索上执行翻译,您可以使用

在这里:

封装的对象,类似于:

public class Description {

    private String name;

    private String language;

    private String description;

    // Getters and Setters.

}
翻译适用于这里:

@Converter
public class DescriptionConverter implements AttributeConverter<Description, String> {

    @Override
    public String convertToDatabaseColumn(Description description) {
        // consume Google API to persist.
    }

    @Override
    public Document convertToEntityAttribute(String description) {
        // consume Google API to retrieve.
    }

}
@转换器
公共类DescriptionConverter实现AttributeConverter{
@凌驾
公共字符串convertToDatabaseColumn(说明){
//使用googleapi来持久化。
}
@凌驾
公共文档convertToEntityAttribute(字符串描述){
//使用GoogleAPI进行检索。
}
}

本教程对我帮助很大。我希望它也能帮助你。我用了第二种方法,效果很好。

您好。那些name和shortDescription字段是否有固定的可能值?这是用户输入吗?@GabrielPimenta你好。它应该是灵活的,用户可以对每个字段进行编辑,而不是固定的。我通常使用SessionLocalerResolver和LocaleChangeInterceptor进行国际化。数据通常从属性文件中提取。每种语言有一个属性文件。这里的示例:@benji2505因为数据是动态的,所以在属性上使用转换表有意义吗?我想我们需要一个更动态的解决方案…谢谢你的研究。您将如何为一个字段提供不同的翻译?我将首先指定描述将以哪种语言保存。然后,每当用户请求一个描述时,我都会使用一个语言属性,将它连同原始描述和所需的翻译一起交给谷歌API进行翻译。我不确定这对我来说是否有帮助。我需要每个字段中的翻译列表,它不是根据用户的位置显示给用户的,而是用于不同导出的数据模型。因为每个字段中都有动态数据,所以不可能有这些字段的翻译表,除非我理解错误。不管怎样,我希望这个建议能对你有所帮助,希望你能找到解决问题的方法。这也是我现在的感受。作为一种解决方法,我现在将一个实体的所有可翻译字段分组到一个单独的实体中(例如EntityA+EntityAtransations),这样我就可以跨每种语言的所有字段创建一个条目。这对于每个实体都是必要的,因此每个实体都会生成一个附加表。无论如何,感谢您的帮助,非常感谢:)
@Entity
@Table(name = "i18n")
public class Translation {

    private String languageCode;
    private String translation;

    //private String referenceToEntity
    //private String referenceToField


}
@Entity
public class EntityA {

    @Convert(converter = DescriptionConverter.class)
    private Description description

    // getters and setters

},
public class Description {

    private String name;

    private String language;

    private String description;

    // Getters and Setters.

}
@Converter
public class DescriptionConverter implements AttributeConverter<Description, String> {

    @Override
    public String convertToDatabaseColumn(Description description) {
        // consume Google API to persist.
    }

    @Override
    public Document convertToEntityAttribute(String description) {
        // consume Google API to retrieve.
    }

}