【问题标题】:Internationalization at db level in Play frameworkPlay 框架中数据库级别的国际化
【发布时间】:2011-10-25 13:52:41
【问题描述】:

在 JPA 中是否有针对多语言字段的干净解决方案?

我想到了这个 db 结构:

餐桌产品

+---------+--------------+-----+ 
| Field   | Type         | Key | 
+---------+--------------+-----+ 
| id      | bigint(20)   | PRI | 
| price   | varchar(255) |     | 
+---------+--------------+-----+ 

表product_lang

+------------------+--------------+-----+ 
| Field            | Type         | Key | 
+------------------+--------------+-----+ 
| id               | bigint(20)   | PRI | 
| lang             | varchar(3)   | PRI | 
| title            | varchar(255) |     | 
| description      | varchar(255) |     | 
+------------------+--------------+-----+ 

这是我想使用的类:

@Entity
public class Product {

  @Id
  public Long id;

  public Double price;

  public Locale lang;

  @Translateable
  public String title;

  @Translateable
  public String description;
}

【问题讨论】:

    标签: hibernate jpa internationalization playframework


    【解决方案1】:

    我不确定您是否可以按照您建议的方式将一个实体映射到两个表。与您想要的类似,您可以将翻译存储为:

    @CollectionOfElements
    Map<String, String> titles;
    

    其中键是用户正在浏览的语言的字符串和要显示的标题的值。这将在数​​据库中创建两个表并允许快速访问翻译。

    【讨论】:

    • 这确实是我的后备解决方案,但我如何查找标题为“%book%”的每个产品(当你有一个语言环境时)。这只能在hql中完成吗?在 Play 中,您可以使用 Product.find("byTitleLike", "%book%").fetch();
    • @Kris Pypen 玩!允许 hql 在里面查找。你可以把查询放在那里
    • 大多数时候只需要一个元素这一事实呢?
    【解决方案2】:

    IMO,错误的解决方案。如果你真的想要数据库国际化,我宁愿创建多个数据库而不是一个包含所有数据的大数据库。

    只需检查语言以获得正确的数据库连接。

    【讨论】:

    • 使用多个数据库将是一场维护噩梦(即使忽略它增加的额外复杂性)......
    • 使用具有许多重复项的单个数据库可能是性能的噩梦。最好的解决方案仍然是应用程序和不同数据库的两个实例。
    • @Zenklys 性能影响不会那么大,特别是使用适当的缓存和索引。
    • 让我们解决这个问题。如果我们谈论的是国际化,这意味着对于上面给出的相同产品解决方案使用不同的语言是可行的。如果我们在产品因语言不同而不同时谈论本地化,那么 IMO 是一个更好的解决方案。
    猜你喜欢
    • 2012-03-14
    • 2012-04-22
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多