2011-06-14 12 views
5

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!

Respuesta

8

Sé que mi pregunta es muy antigua, pero probablemente alguien encuentre esto y quiera saber cómo hacerlo.

Bueno, mi solución final es crear elementos integrados o compuestos dentro de un mapa. Muy fácil, pero debes saber cómo hacerlo. Aquí hay un ejemplo de cómo hacer eso con anotaciones:

@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; 
    } 
} 

espero que esto ayude a alguien, si quieres un ejemplo para los archivos hbm.xml acaba de comentar y voy a añadir que.

+0

los archivos hbm.xml serán realmente útiles, aunque ya llegué tarde a la fiesta – Gautam

+1

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. –

+0

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