一尘不染

数据库表中的多语言字段

hibernate

我有一个需要支持多语言界面的应用程序,确切地说是五种语言。对于接口的主要部分,可以使用标准的Res​​ourceBundle方法来处理。

但是,数据库包含许多表,这些表的元素包含人类可读的名称,描述,摘要等。必须有可能以所有五种语言输入每一个。

虽然我想我可以简单地在每个表上都有字段

NameLang1
NameLang2
...

我认为在编写代表每个表的bean时,这会导致大量的很大程度上相同的代码。

从纯粹面向对象的角度来看,解决方案很简单。每个类仅具有一个Text对象,其中包含每种语言的相关文本。这在进一步帮助方面是,只有一种语言是强制性的,其他语言具有回退规则(例如,如果语言4缺少返回语言2,而回退语言是强制性的语言1)。

不幸的是,将其映射回关系数据库意味着我只剩下一个表,其中有10到12个其他表FK(实际上有些表具有多个FK)。

这种方法似乎可行,并且我已经能够使用Hibernate将数据映射到POJO。关于您唯一不能做的就是将一个Text对象映射到其父对象(因为您无法知道应该链接到哪个表),但是几乎不需要这样做。

因此,总的来说这似乎可行,但是让多个表这样引用一个表只是感觉不对。有人有更好的主意吗?

如果很重要,我正在使用MySQL …


阅读 638

收藏
2020-06-20

共1个答案

一尘不染

我不得不做一次…一些表的多语言文本…我不知道我是否找到了最佳的解决方案,但是我所做的是让该表具有与语言无关的信息,然后是一个具有所有多语言领域。子表中至少需要一条记录(使用默认语言);以后可以添加更多语言。

在Hibernate上,您可以将子表中的信息映射为Map,并获取所需语言的信息,从而像您说的那样在POJO上实现后备。您可以为多语言字段使用不同的getter,在内部调用fallback方法以获取所需语言的适当子对象,然后仅返回所需字段。

这种方法使用更多的表(需要多语言信息的每个表都有一个额外的表),但是性能要好得多,而且维护我认为…

2020-06-20