2012-01-14 42 views
3

我有一个具有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领域,我想我已经用映射的一个问题。

我在哪里错了?

+0

好问题!我的猜测是你需要为每种语言创建一个索引(除非你想混合它们),但不知道映射,可能在映射文件中使用request_locale? – 2012-01-14 16:27:58

+0

什么是TransaltedString? – Firo 2012-01-18 11:09:08

回答

1
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()); 
} 
+0

我没有2个表格,我只有TranslatedStrings表格。 – Burak 2012-01-18 18:54:30

+0

http://stackoverflow.com/questions/6350415/internationalization-with-hibernate是同一主题。但我无法插入任何。它说:休眠:插入类别值() 然后给出错误 – Burak 2012-01-23 21:16:45

+0

什么错误?名称,消息和/或堆栈跟踪将有所帮助 – Firo 2012-01-24 08:40:45