Интернационализация с Hibernate - PullRequest
5 голосов
/ 15 июня 2011

Я бы хотел, чтобы что-то подобное было сгенерировано из hbm2ddl:

______________    ______________       _______________
|Language    |    |I18N        |       |Test         |
--------------    --------------       ---------------
|iso3_code:PK|----|iso3_code:PK|       |test_id:PK   |
--------------    |i18n_id:PK  |-------|desc_i18n_id |
                  |i18n_text   |     |-|labl_i18n_id |
                  --------------       ---------------

Это означает более или менее, что существует табличный язык, который содержит iso-код и, возможно, некоторую другую информацию.Таблица i18n имеет внешний ключ iso3_code для языковой таблицы, который также является первичным ключом.Другая часть PK - это i18n_id.Затем в тестовой таблице есть два внешних ключа в таблице i18n в поле i18n_id.

Вывод проанализированного hbm2ddl должен выглядеть следующим образом:

public class Test  implements java.io.Serializable {
    private Integer testId;
    private Map<String,String> label = new HashMap<String,String>(0);
    private Map<String,String> description = new HashMap<String,String>(0);

    public Test() {
    }

    public Integer getTestId() {
        return this.testId;
    }

    public void setTestId(Integer testId) {
        this.testId = testId;
    }

    public Map<String, String> getLabel() {
        return label;
    }

    public void setLabel(Map<String,String> label) {
        this.label = label;
    }

    public Map<String, String> getDescription () {
        return description ;
    }

    public void setDescription (Map<String,String> description ) {
        this.description = description ;
    }

}

Итак, вопрос в том, какимеет мой файл hbm.xml для создания этой структуры таблицы и этого класса.Даже если я не могу создать все ресурсы полностью автоматически, мне бы очень хотелось узнать, как это должно быть объявлено.Я уже заставил его работать для выборок, но не для вставок или обновлений.

<class name="test.Test" table="test" catalog="testdb">
    <id name="testId" type="java.lang.Integer">
        <column name="test_id" />
        <generator class="native" />
    </id>
    <map name="label" table="i18n" fetch="join" cascade="all">
        <key column="i18n_id" not-null="true" foreign-key="label_id"/>
        <map-key column="iso3_code" type="string"/>
        <element column="i18n_text" type="string"/>
    </map>
</class>

<class name="test.Lang" table="lang" catalog="testdb">
    <id name="iso3Code" type="string">
        <column name="iso3_code" length="4" />
        <generator class="assigned" />
    </id>
</class>

<class name="test.I18n" table="i18n" catalog="testdb">
    <composite-id name="id" class="com.blazebit.test.I18nId">
        <key-property name="i18nId" type="int">
            <column name="i18n_id" />
        </key-property>
        <key-property name="iso3Code" type="string">
            <column name="iso3_code" length="4" />
        </key-property>
    </composite-id>
    <property name="i18nText" type="string">
        <column name="i18n_text" />
    </property>
</class>

Я действительно не знаю, почему вставка не работает, но, возможно, это потому, что объект I18nId должен идентифицировать текст, не может быть сгенерировано.В этом случае я бы также принял решение, подобное этому: Map getLabel () {}

Но с этим решением возникнет другая проблема, i18n_id не может быть установлен mysql с auto_increment.Это было бы возможно без гибернации.

Пожалуйста, кто-нибудь поможет мне или даст лучшую практику о том, как реализовать это!

1 Ответ

8 голосов
/ 30 сентября 2011

Я знаю, что мой вопрос очень старый, но, возможно, кто-то найдет это и захочет узнать, как это сделать!

Что ж, мое последнее решение - создание встроенных или составных элементов на карте. Довольно просто, но вы должны знать, как это сделать. Вот пример того, как сделать это с аннотациями:

@Entity
@Table(name="A")
public class A implements Serializable{

    private Map<Locale, LocalizedA> localized = new HashMap<Locale, LocalizedA>();

    @ElementCollection
    @CollectionTable(name = "localized_a")
    @MapKeyJoinColumn(name = "field_name_for_locale")
    public Map<Locale, LocalizedA> getLocalized() {
        return this.localized;
    }

    public void setLocalized(Map<Locale, LocalizedA> localized) {
        this.localized = localized;
    }

}


@Embeddable
public class LocalizedA implements java.io.Serializable {

    @Column(name = "field_name_for_description")
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Надеюсь, это кому-нибудь поможет, если вам нужен пример для файлов hbm.xml, просто прокомментируйте, и я добавлю это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...