【发布时间】:2018-04-19 09:00:52
【问题描述】:
尊敬的 Stackflow 社区,
我希望在我的实体中存储国际化字符串,但我正在努力解决这个问题。我将在这里描述我能想到的两种解决方案,并希望收到您的反馈。
解决方案 1:从实体外部化
在这个解决方案中,我的数据库中有下表:
LabelId Language VALUE Entity Id
WELCOME_TEXT EN "..." Questionnaire 1
WELCOME_TEXT DE "..." Questionnaire 1
GOODBYE_TEXT EN "..." Questionnaire 1
GOODBYE_TEXT DE "..." Questionnaire 1
QUESTION_TITLE EN "..." Question 12
QUESTION_TITLE DE "..." Question 12
OPTION_NAME EN "..." Option 23
OPTION_NAME DE "..." Option 23
FACTOR_NAME EN "..." Factor 11
FACTOR_NAME DE "..." Factor 11
我将始终使用以下方法访问此集合:
void setLabels(Entity entity, LabelId labelId, Map<String, String langValues)
Map<String, String> getLabels(Entity entity, LabelId labelId)
解决方案 2:使用元素集合
在此解决方案中,所有实体都将 Map 存储在同一个表中:
LabelId Language VALUE questionnaire_id factor_id question_id option_id
WELCOME_TEXT EN "..." 1
WELCOME_TEXT DE "..." 1
GOODBYE_TEXT EN "..." 1
GOODBYE_TEXT DE "..." 1
QUESTION_TITLE EN "..." 12
QUESTION_TITLE DE "..." 12
OPTION_NAME EN "..." 23
OPTION_NAME DE "..." 23
FACTOR_NAME EN "..." 11
FACTOR_NAME DE "..." 11
然后,我将按以下格式映射我的实体中的所有字段:
i18n.java:
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"label", "language", "questionnaire_id", "question_id", ... })})
public class i18n extends PersistentObject { // where it gets ID from
Label label; // enum
Language language; // enum
String value; // the actual text
// bi-directional links to the linked entities
@ManyToOne Questionnaire questionnaire;
@ManyToOne Question question;
...
}
问卷调查.java:
@OneToMany(mappedBy = "questionnaire")
List<i18n> labels;
问题.java:
@OneToMany(mappedBy = "question")
List<i18n> labels;
解决方案 3:非解决方案
另一种简单的方法是为每个属性简单地存储一个这样的地图:
@ElementCollection
Map<String, String> welcomeText;
@ElementCollection
Map<String, String> goodbyeText;
...
这个解决方案在我的数据库中创建了大量的表,这将使查询和维护变得混乱。
结论
第一个解决方案为我提供了一个更好的表格,但代价是每次我需要标签时都必须通过附加服务检索标签。 第二种解决方案保持实体的代码干净,但 SQL 表很乱,所有需要翻译的实体都有很多列。
你会如何处理这个问题?有没有更好的解决方案?
提前感谢所有反馈!
【问题讨论】:
-
桌面或网络应用程序?
-
我不确定我是否理解您提问的原因。它不应该真的有所作为。在这种情况下,此应用程序有许多客户端(多个应用程序、浏览器版本等)。这是关于后端的数据结构。
-
桌面应用程序应该读取一次字符串并缓存。这些是少数波兰语转换解决方案,使用 JPA 效果不佳。
标签: sql hibernate jpa internationalization