Я бы хотел, чтобы что-то подобное было сгенерировано из 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.Это было бы возможно без гибернации.
Пожалуйста, кто-нибудь поможет мне или даст лучшую практику о том, как реализовать это!