me gustaría tener algo como esto se genera a partir de hbm2ddl:internacionalización con Hibernate
______________ ______________ _______________
|Language | |I18N | |Test |
-------------- -------------- ---------------
|iso3_code:PK|----|iso3_code:PK| |test_id:PK |
-------------- |i18n_id:PK |-------|desc_i18n_id |
|i18n_text | |-|labl_i18n_id |
-------------- ---------------
Esto significa más o menos eso, no es un lenguaje de mesa, que contiene el código ISO y tal vez alguna otra información. La tabla i18n tiene una clave externa iso3_code en la tabla de idiomas que también es una clave principal. La otra parte del PK es el i18n_id. La tabla de prueba tiene dos claves foráneas en la tabla i18n en el campo i18n_id.
La salida del hbm2ddl analizado debería ser así:
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 ;
}
}
Así que ahora la pregunta es, ¿tiene mi archivo hbm.xml para parecerse a generar esta estructura de la tabla y esta clase. Incluso si no puedo crear todos los recursos automáticamente, me gustaría saber cómo se debe declarar. Ya lo tengo para trabajar para seleccionar, pero no para inserciones o actualizaciones.
<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>
Realmente no sé por qué el inserto no funciona, pero tal vez es porque el objeto I18nId que debe identificar un texto, no se puede generar. En este caso, también aceptaría una solución como esta: Map getLabel() {}
Pero con esta solución surgirá otro problema, el i18n_id no puede ser configurado por mysql con auto_increment. Sería posible sin hibernar.
¡Por favor, que alguien me ayude o dé una mejor práctica sobre cómo implementar esto!
los archivos hbm.xml serán realmente útiles, aunque ya llegué tarde a la fiesta – Gautam
Lo siento pero ya no uso archivos hbm.xml. Cambié por completo a las anotaciones. Creo que no debería ser tan difícil crear archivos hbm.xml basados en la solución de anotación. –
Llego muy tarde a la fiesta, pero parece que tienes una solución muy elegante. Sin embargo, de su ejemplo, estoy luchando por conectar los puntos. ¿Sería capaz de compartir la solución completa como se mostró en la publicación original (ejemplo de 3 tablas)? – zalis