【问题标题】:Mapping i18n tables in JPA在 JPA 中映射 i18n 表
【发布时间】:2011-11-06 02:21:13
【问题描述】:

我正在尝试使用 JPA 从数据库(60 个表)中映射表。我正在为多语言应用程序执行此操作,因此每条数据都必须以一种以上的语言提供。

我的数据库表结构是这样的。我有一个 Region 表,它与 RegionLanguage 表相关。 RegionLanguage 表实际上包含该区域的不同语言的描述。你可能想看看这张图:

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

感谢您的帮助。

提前致谢。

【问题讨论】:

  • 你找到解决这个问题的方法了吗?如果是这样,您介意分享它(作为答案)吗?我们面临同样的问题,还没有找到好的解决方案(大多数结果是 N+1 查询,我们绝对不想要)。
  • 您使用的是哪个 JPA 提供程序?
  • 我不完全明白为什么 Region 和 RegionLanguage 之间的简单 @OneToMany 关联对您不起作用?

标签: jpa internationalization locale multilingual


【解决方案1】:

我不确定我是否理解这个奇怪的图表...... 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 表连接的。根据您的描述,我猜,所有表都具有对 RegionLanguage 的 fk。我不确定 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 映射”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2011-07-13
    • 2019-03-27
    • 2011-07-25
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多