【问题标题】:Localization of entity fields in Spring HibernateSpring Hibernate中实体字段的本地化
【发布时间】:2019-11-07 05:11:03
【问题描述】:

我有两个实体的字段我想本地化。但是,我不确定如何正确实现它,因为我需要对实体的引用以及对已翻译字段的引用,才能拥有一个共享的“i18n”表。

@Entity
public class EntityA {

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Translation> name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Translation> description;

}

第二个实体

@Entity
public class EntityB {

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Translation> name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Translation> shortDescription;

}

翻译实体

@Entity
@Table(name = "i18n")
public class Translation {

    private String languageCode;
    private String translation;

    //private String referenceToEntity
    //private String referenceToField


}

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

编辑

我写了一篇关于我如何使用 XmlAnyAttribute https://overflowed.dev/blog/dynamical-xml-attributes-with-jaxb/ 解决它的短文

【问题讨论】:

  • 你好。这些 name 和 shortDescription 字段是否具有固定的可能值?这些会是用户输入吗?
  • @GabrielPimenta 你好。它应该是用户对每个字段的灵活和可编辑的,而不是固定的
  • 我通常使用 SessionLocaleResolver 和 LocaleChangeInterceptor 进行国际化。数据通常是从属性文件中提取的。每种语言都有一个属性文件。此处示例:mkyong.com/spring-mvc/spring-mvc-internationalization-example
  • @benji2505 由于数据是动态的,在属性上使用转换表是否有意义?我猜我们需要一个更动态的解决方案......

标签: java spring hibernate spring-boot internationalization


【解决方案1】:

我做了一些研究,发现了这个@Convert JPA 注释。您需要将 name 和 description 属性封装到一个对象(实现 AttributeConverter)中,并使用转换类来指定它在持久化时将如何转换,以及在检索时将如何转换。

要在持久性和检索上执行翻译,您可以使用Google translate's API

这里:

@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.
    }

}

【讨论】:

  • 感谢您的研究。您将如何为一个领域提供不同的翻译?
  • 我会首先指定描述将以哪种语言保存。然后,每当用户请求描述时,我会使用语言属性并将其与原始描述一起提供给 Google API 和所需的翻译,以便翻译。
  • 我不确定它是否对我有帮助。我需要每个字段中的翻译列表,它并不是要根据用户的位置显示给用户,而是要用于稍后用于不同导出的数据模型
  • 由于每个字段都有动态数据,所以不可能有翻译表,除非我理解错了。无论哪种方式,希望该建议对您有所帮助,并且您设法找到解决问题的方法。
  • 这也是我现在的感受。作为一种解决方法,我现在将一个实体的所有可翻译字段分组到一个单独的实体中(例如 EntityA + EntityATranslations),这样我就可以在每种语言的所有字段中创建一个条目。每个单独的实体都需要它,因此每个实体生成一个额外的表。无论如何感谢您的帮助,非常感谢:)
【解决方案2】:

本教程对我帮助很大。我希望它也能帮助你。我用了第二种方法,效果很好。Localized Data – How to Map It With Hibernate

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2011-05-26
    • 2012-02-29
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多