Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate mapping for multilanguage support

I have a Category class which has id, name, description attributes.

I want that user can enter multilingual name and description and save them.

What should be the structure of the class and the hibernate mapping?

This is my code with annotations. But I couldn't insert anything to database:

@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;
}

}

I have two tables: translated_string : tid, text, langCode category: id, name_id, description_id

I am getting this info message: Hibernate: insert into category values ( ) when I want to save the category by hibernateTemplate.

And when I want to find a category by id, it executes

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=?

Since my translated_string table doesn't have Category_id or name_KEY fields, i think I have a problem with the mapping.

Where am I wrong?

like image 452
Burak Avatar asked Jan 19 '26 23:01

Burak


1 Answers

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);
    }
}

and the mapping

<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>

my java is a bit rusty, feel free to correct syntax

Update: annotations for simple string maps, which should suffice

@ElementCollection
@CollectionTable(name="TranslatedStrings", joinColumns=@JoinColumn(name="names_category_id"))
@Column(name="value")
public Map<String, String> getNames()

@ElementCollection
@CollectionTable(name="TranslatedStrings", joinColumns=@JoinColumn(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());
}
like image 52
Firo Avatar answered Jan 21 '26 15:01

Firo