2011-06-14 4 views
5

Я хотел бы иметь что-то вроде этого генерироваться из hbm2ddl:Интернационализация с Hibernate

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

Это означает, что более или менее, что существует язык таблица, которая содержит код изо и, возможно, некоторые другие данные. Таблица i18n имеет внешний ключ iso3_code на языковой таблице, который также является первичным ключом. Другая часть ПК - 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. Это было бы возможно без спящего режима.

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

ответ

8

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

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

@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 файлов просто комментарий, и я добавлю, что.

+0

hbm.xml файлы действительно будут полезны, хотя я довольно поздно на вечеринку – Gautam

+1

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

+0

Я очень опаздываю на вечеринку, но похоже, что у вас очень элегантное решение. Однако из вашего примера я пытаюсь подключить точки. Вы могли бы поделиться полным решением, как вы продемонстрировали в оригинальном посте (пример из 3 таблиц)? – zalis

Смежные вопросы