在JPA中映射i18n表

时间:2011-08-29 14:45:28

标签: jpa internationalization locale multilingual

我正在尝试使用JPA从数据库(60个表)映射表。我这样做是为了多语言应用程序,因此每个数据都必须以多种语言提供。

我的数据库表结构是这样的。我有一个Region表,它与RegionLanguage表有关。 RegionLanguage表实际上以不同语言保存该Region的描述。您可能需要查看此图表:

enter image description here

说到JPA,我发现很难以尽可能少的关联来映射它。我曾尝试使用辅助表概念,但在某些情况下失败,因为这是一个@OneToMany关系。最好是,我正在考虑一种解决方案,使这两个表显示为单个对象。

感谢您的帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个奇怪的图... RegionLanguage有一些指向Region.id的外键,我接受了吗?如果Region只有一列(如'图表'所示),您只需映射'RegionLanguage',您只需要一个实体 - 没有信息丢失;)。

但严重的是,您希望如何映射?你想要这样的东西:

class Region {
//.. the missing fields not shown in diagram
    List<String> languages;  // take only language to avoid creating separate entity for region language
}

或类似的东西:

class RegionInnerJoinRegionLanguage {
// all fields from Region
// all fields from RegionLanguage
}

在任何情况下,您都没有说明其余表如何与您的i18n表连接。从你的描述,我猜,所有的表都有fk到RegionLanguage。我不确定Region表是用在宏观方案中的。我想这只是为了分组语言......我想这个'模特'瑞士(一个'地区'4种语言)......但你会用几种地区的语言做什么?你会有几种法语,英语等语言(每个地区一种语言)并且所有数据都会成倍增加吗?

我知道你不要求这个......我只是认为你过分简化了这个问题的数据结构......以至于你很难猜到你真正想要实现的目标。

在任何情况下,如果你想使用字符串列表方法,你可以试试这个:

  @ElementCollection
  @CollectionTable(name="RegionLanguage",
        joinColumns=@JoinColumn(name="regionID") // or whatever... it's not on your diagram.
  )
  @Column(name="langage")
  private List<String> langages;

我仍然不明白你为什么要把两个表放在一个实体中...如果它是'只读'数据,你可能会尝试创建一个视图并映射它 - 总是一个'出路' )。但事实上,它(其中两个都是)过于复杂化,在我看来 - 它将来会咬你。我的建议是使用'简单的OneToMany映射'。