我正在嘗試向Java實體添加國際化(多語言)支持。在向每個新字段添加翻譯時,我都會盡可能使用盡可能少的樣板代碼。我不僅限於JPA,也可以使用hibernate註釋。在最糟糕的情況下,普通的sql也適用。可能有一些我沒有找到的準備好的庫。 它不應該遵循我的想法描述如下。如何國際化Hibernate實體
理想情況下,我需要的數據庫看起來像這樣:
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列的表格:id
,locale
和text
。表parent
有一個列text
(如果只有一個字段需要i18n,否則包含更多列),其中包含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
我該如何擺脫這額外的列?是否有可能避免將i18n
表引用到parent
表中?此鏈接使難以重用i18n
表。我需要在i18n
表中保存一些鑑別值,或者在整個數據庫中使用GUID,因爲不同表中的ID會發生衝突。第一個選項意味着大量的樣板代碼。第二種選擇意味着當前項目需要完成很多工作。
我需要一種可重複使用的方法來將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
}
什麼是不必要的parent_id字段?您的元素集合需要某種方式將生成的表內的行與父實體關聯 - 一個外鍵。也許顯示你希望數據庫看起來如何,有人可以幫助你弄清楚如何映射實體。 – Chris
我添加了所需的數據庫說明。我需要一個可重用的i18n表,以便與父母建立一對多的關係。我需要能夠使用相同的i18n表來存儲其他字段的翻譯。 Parent.text&i18n.id應該是將生成的表中的行與父實體相關聯的方式。外鍵約束可能只存在於parent.text中。 – user1603038
你可以展示完整的'i18n'類嗎? –