当前位置: 首页 > 面试题库 >

Hibernate国际化

姬裕
2023-03-14
问题内容

我想从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_id的表i18n上具有两个外键。

解析的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(){}

但是使用这种解决方案将会出现另一个问题,mysql无法使用auto_increment设置i18n_id。没有hibernate就可以。

请任何人帮助我或对如何实现这一目标进行更好的练习!


问题答案:

我知道我的问题很老,但是可能有人发现了这个问题并想知道该怎么做!

好吧,我的最终解决方案是在地图内创建嵌入式或复合元素。相当简单,但是您必须知道该怎么做。这是有关如何使用批注执行此操作的示例:

@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文件的示例,只需注释一下,然后我将其添加。



 类似资料:
  • 问题内容: Hibernate验证程序是否支持国际化。我看到了罐子,可以看到各种ValidationMessages.properties文件。 我们是否可以创建自己的将国际化的自定义错误消息?我不想使用Hibernate验证程序默认提供的错误消息。 我们需要使用我们自己的自定义消息,它们应该被国际化。 Hibernate验证程序支持哪些语言。在jar中,我看到了英语,法语,德语,土耳其语和蒙古语

  • 概述 为了让Django项目可翻译,你必须添加一些钩子到你的Python 代码和模板中。这些钩子叫做翻译字符串。它们告诉Django:“如果这个文本的翻译可用,应该将它翻译成终端用户的语言。”你需要标记这些可翻译的字符串;系统只会翻译它知道的字符串。 Django 提供一些工具用于提取翻译字符串到消息文件中。这个文件方便翻译人员提供翻译字符串的目标语言。翻译人员填充完消息文件后,必须编译它。这个过

  • 介绍 Vant 采用中文作为默认语言,同时支持多语言切换,请按照下方教程进行国际化设置。 使用方法 多语言切换 Vant 通过 Locale 组件实现多语言支持,使用 Locale.use 方法可以切换当前使用的语言。 import { Locale } from 'vant'; // 引入英文语言包 import enUS from 'vant/es/locale/lang/en-US'; L

  • 国际化 Element 组件内部默认使用中文,若希望使用其他语言,则需要进行多语言设置。以英文为例,在 main.js 中: // 完整引入 Element import Vue from 'vue' import ElementUI from 'element-ui' import locale from 'element-ui/lib/locale/lang/en' Vue.use(Elem

  • 资料 ​https://tc39.es/ecma402/​

  • 一般用于根据用户语言,需要输出不同的文案。如果没有国际化的封装,业务里面会有大量的判断,并且业务也不好维护,没法统一管理所有文案。 安装 composer require swoft/i18n Git 仓库 Github https://github.com/swoft-cloud/swoft-event 参与贡献 欢迎参与贡献,您可以 fork 我们的开发仓库 swoft/component