如何国际化休眠实体
我正在尝试向Java实体添加国际化(多种语言)支持。在向每个新字段添加翻译时,我对使用尽可能少的样板代码的任何选项持开放态度。我不仅限于JPA,也可以使用休眠注释。在最坏的情况下,普通sql也适合。可能有一些现成的库,我还没有找到。它不应该遵循我下面描述的想法。
理想情况下,我需要数据库如下所示:
i18n
+------+--------+------+
| id | locale | text |
+------+--------+------+
| 1 | en | foo |
+------+--------+------+
| 1 | de | bar |
+------+--------+------+
| 2 | en | foo2 |
+------+--------+------+
| 2 | de | bar2 |
+------+--------+------+
parent
+------+------+
| id | text |
+------+------+
| 99 | 1 |
+------+------+
| 100 | 2 |
+------+------+
i18n
是一个应仅包含 3 列的表:、 和 。表有一列(如果只有一个字段需要 i18n,否则会包含 来自 的值。我在父类中尝试了以下映射:id
locale
text
parent
text
i18n.id
@ElementCollection @CollectionTable(name="i18n", joinColumns = @JoinColumn(referencedColumnName="id"))
@MapKeyColumn(name="locale") @Column(name="text")
public Map<String, String> text = newHashMap();
当禁用 DDL 生成并且我自己创建表时,它似乎可以正常工作,但是当启用 DDL 生成时,它会为其生成一个不必要的列和一个约束:i18n.parent_id
ALTER TABLE PUBLIC.I18N ADD CONSTRAINT
PUBLIC.FK_HVGN9UJ4DJOFGLT8L78BYQ75I FOREIGN KEY(PARENT_ID) INDEX
PUBLIC.FK_HVGN9UJ4DJOFGLT8L78BYQ75I_INDEX_2 REFERENCES
PUBLIC.PARENT(ID) NOCHECK
如何摆脱这个额外的列?是否有可能避免从一个表到另一个表的引用?此链接使得重用表变得困难。我要么需要在表中保留一些鉴别器值,要么在整个数据库中使用GUID,因为不同表中的id会发生冲突。第一个选项意味着大量的样板代码。第二个选项意味着在当前项目中需要完成大量工作。i18n
parent
i18n
i18n
我需要一种可重用的方式将i18n添加到实体。我的父类大致如下所示。并且将有几个这样的父类,它们具有不同的字段集,必须进行国际化。
@Entity
public class Parent {
@Id @GeneratedValue
public Long id;
public String title; // must be in internationalized
public String text; // must be in internationalized
public String details; // must be in internationalized
// ... other fields
}