Я хотел бы иметь что-то вроде этого генерироваться из 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. Это было бы возможно без спящего режима.
Пожалуйста, помогите мне или дайте лучшую практику, как это реализовать!
hbm.xml файлы действительно будут полезны, хотя я довольно поздно на вечеринку – Gautam
Извините, но я больше не использую файлы hbm.xml. Я полностью переключился на аннотации. Я думаю, что не должно быть так сложно создавать файлы hbm.xml на основе аннотационного решения. –
Я очень опаздываю на вечеринку, но похоже, что у вас очень элегантное решение. Однако из вашего примера я пытаюсь подключить точки. Вы могли бы поделиться полным решением, как вы продемонстрировали в оригинальном посте (пример из 3 таблиц)? – zalis