支持多语言的Hibernate映射
问题描述:
我有一个具有id,name,description属性的Category类。支持多语言的Hibernate映射
我想让用户可以输入多种语言名称和说明并保存它们。
应该是什么类的结构和hibernate映射?
这是带注释的代码。但我不能插入什么数据库:
@Entity
@Table(name = "category")
public class Category {
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private Integer id;
private Map<String, TranslatedString> name;
private Map<String, TranslatedString> description;
@ElementCollection
@CollectionTable(name = "translated_string")
@MapKeyJoinColumn(name = "langCode")
public Map<String, TranslatedString> getName() {
return this.name;
}
public void setName(Map<String, TranslatedString> name) {
this.name = name;
}
@ElementCollection
@CollectionTable(name = "translated_string")
@MapKeyJoinColumn(name = "langCode")
public Map<String, TranslatedString> getDescription() {
return this.description;
}
public void setDescription(Map<String, TranslatedString> description) {
this.description = description;
}
}
@Embeddable
public class TranslatedString {
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
private Integer tid;
private String langCode;
@Column(name = "langCode")
public String getLangCode() {
return langCode;
}
public void setLangCode(String langCode) {
this.langCode = langCode;
}
private String text;
@Column(name = "text")
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
我有两个表: translated_string:TID,文字的langCode 类:身份证,名_ID,description_id
我得到这个信息的消息: 休眠:当我想通过hibernateTemplate保存类别时,插入类别值() 。
当我想找到ID的类别,它执行
select
name0_.Category_id as Category1_0_0_,
name0_.langCode as langCode0_,
name0_.text as text0_,
name0_.tid as tid0_,
name0_.name_KEY as name5_0_
from translated_string name0_
where name0_.Category_id=?
由于我translated_string表没有CATEGORY_ID或name_KEY领域,我想我已经用映射的一个问题。
我在哪里错了?
答
class Category {
public int Id;
public Map<Language, String> names;
public Map<Language, String> descriptions;
public String getCurrentName()
{
// get current Language from somewhere
return names.GetValue(currentLanguage);
}
}
和映射
<map name="names" table="names">
<key column="categoryid" />
<index column="language_id" />
<element column="value"/>
</map>
<map name="descriptions" table="descriptions">
<key column="categoryid" />
<index column="language_id" />
<element column="value" length="whatever"/>
</map>
我的Java是一个有点生疏,随时纠正语法
更新:注解简单的字符串的地图,这应该足够了
@ElementCollection
@CollectionTable(name="TranslatedStrings", [email protected](name="names_category_id"))
@Column(name="value")
public Map<String, String> getNames()
@ElementCollection
@CollectionTable(name="TranslatedStrings", [email protected](name="descriptions_category_id"))
@Column(name="value")
public Map<String, String> getDescriptions()
public String getCurrentName()
{
// get current Language from somewhere
return names.GetValue(currentLanguage.getCode());
}
好问题!我的猜测是你需要为每种语言创建一个索引(除非你想混合它们),但不知道映射,可能在映射文件中使用request_locale? – 2012-01-14 16:27:58
什么是TransaltedString? – Firo 2012-01-18 11:09:08