Отображение Hibernate для поддержки мультиязычности - PullRequest
3 голосов
/ 14 января 2012

У меня есть класс Category, в котором есть атрибуты id, name, description.

Я хочу, чтобы пользователь мог вводить многоязычные имя и описание и сохранять их.

Чтодолжна быть структура класса и отображение гибернации?

Это мой код с аннотациями.Но я не смог ничего вставить в базу данных:

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

}

У меня есть две таблицы: translation_string: tid, text, langCode категория: id, name_id, description_id

Я получаю это информационное сообщение: Hibernate: вставить в значения категории (), когда я хочу сохранить категорию с помощью hibernateTemplate.

А когда я хочу найти категорию по идентификатору, она выполняет

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

, так как мой translation_stringВ таблице нет полей Category_id или name_KEY, я думаю, что у меня проблема с отображением.

Где я ошибаюсь?

1 Ответ

1 голос
/ 15 января 2012
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", 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());
}
...