【问题标题】:How to achieve working with autogenerated composite keys in Hibernate + MySql - MariaDB如何在 Hibernate + MySql 中使用自动生成的复合键 - MariaDB
【发布时间】:2015-03-30 16:36:16
【问题描述】:

我一直在阅读一些关于在 MySql 中使用复合键的文章,发现 composite key can't own a auto_increment id column.但是,我有兴趣使用类似的功能。让我们解释一下:

使用 MariaDB 10 (InnoDB) 和 Hibernate 3.6.9

我想做一些可翻译的应用程序表字段。我认为只有一张翻译表就足够了。这个表有一个复合键,它有一个 int 值作为翻译的键,还有具体文本的语言环境值。相同的 idlocale 值不能作为条目放置。

这就是模型的样子:

我不希望将每个随机实体作为集合加载翻译,我正在考虑像String translationFor(Integer id, Locale loc) 这样的方法可以为我当前的语言环境做到这一点。但是,当我保存一些翻译集时,我想为它们分配相同的 ID。让我们来看看这个案例:

  • 西班牙语: Cuchara
  • 英语:勺子

表格应如下所示:

id  locale  translation
1   es      Cuchara
1   en      Spoon

但我不能告诉 MySql 有一个带有 auto_increment 列的复合 id。所以,我认为我应该手动分配它,执行以下步骤:

  • 使用语言环境值构建 Translation 实体
  • 在 Hibernate 会话中开始事务
  • 检索translations 表中的最后一个id
  • 手动将其分配给实体
  • 保存它们
  • 提交事务

这是最合适的方式吗?我是在原子操作吗?

【问题讨论】:

    标签: mysql hibernate mariadb


    【解决方案1】:

    我假设您计划有多个需要翻译“勺子”的表?如果是这样,让我把你的注意力从id移开。

    转换表需要PRIMARY KEY(code, locale),其中code 是您在`random_table_1 中拥有的some_translatable_value

    code 可以是您最喜欢的语言的字符串(可能是缩写)。请注意,如果您稍后更改文本的措辞(改为“银勺”),请不要返回并更改 code;它可以保持不变(“勺子”)。

    我不知道你是否可以在 Hibernate 中实现这一点;我对此并不流利。 (我倾向于避免使用第 3 方包;它们往往会妨碍您。)如果 Hibernate 强制您在每个表上都有一个 AUTO_INCREMENT id,那就这样吧。这将是一种无害的废物。然后,您应该将 (code, locale) 对声明为 unique(以便获得所需的索引)。

    【讨论】:

    • 感谢您的回答瑞克。我的目标是让翻译表链接到任何需要翻译的表,你是对的。但是,我看不出你的提议有什么意义。您基本上是在建议更改字符串的 id,但这将迫使我要么让我的控制器生成它,要么让最终用户输入它。 :-(
    • 如果你打算分享翻译,比如在多个地方需要“spoon”,那么你需要一些key来获取Cuchara/spoon/等。一种方法是拥有一个 INT,但这不是很人性化。另一种方法是发明一些代码(例如,“勺子”),希望记住“我的翻译表里已经有勺子了;我不需要再次输入它。”
    • 如果您从不(或很少)在多个地方需要相同的翻译,那么我对code VARCHAR(...) 的评论是无关紧要的;坚持使用int
    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 2011-11-28
    • 2016-03-08
    • 1970-01-01
    • 2019-05-04
    • 2011-05-06
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多