如何在Hibernate + MySql - MariaDB中使用自动生成的复合键

时间:2015-03-30 16:36:17

标签: mysql hibernate mariadb

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

使用MariaDB 10(InnoDB)和Hibernate 3.6.9

我想做一些可翻译的应用程序表字段。我认为只有一个翻译表就足够了。此表有一个复合键,其中 int 值作为转换的键,也是具体文本的语言环境值。相同的 id 区域设置值不能作为条目放置。

这就是模型的样子:

enter image description here

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

  • 西班牙语: Cuchara
  • 英文: Spoon

该表格应如下所示:

id  locale  translation
1   es      Cuchara
1   en      Spoon

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

  • 使用区域设置值构建Translation实体
  • 在Hibernate会话中开始一个事务
  • 检索id
  • 中的最后一个translations
  • 手动将其分配给实体
  • 保存他们
  • 提交交易

这是最合适的方式吗?我是原子地做的吗?

1 个答案:

答案 0 :(得分:0)

我假设您计划让多个表格需要翻译“勺子”?如果是这样,请允许我将注意力从id移开。

转换表需要PRIMARY KEY(code, locale),其中code与`random_table_1中的some_translatable_value相同。

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

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