我一直在阅读一些关于在MySql中使用复合键的文章,并发现composite key can't own a auto_increment id column。但是,我对使用类似功能感兴趣。让我们解释一下:
使用MariaDB 10(InnoDB)和Hibernate 3.6.9
我想做一些可翻译的应用程序表字段。我认为只有一个翻译表就足够了。此表有一个复合键,其中 int 值作为转换的键,也是具体文本的语言环境值。相同的 id 和区域设置值不能作为条目放置。
这就是模型的样子:
我不希望将每个随机实体的翻译作为集合加载,我正在考虑像String translationFor(Integer id, Locale loc)
这样的方法可以为我当前的语言环境做这件事。但是,当我保存一些翻译集时,我想为它们分配相同的ID。让我们来看看这个案例:
该表格应如下所示:
id locale translation
1 es Cuchara
1 en Spoon
但我不能告诉MySql有一个带auto_increment列的复合id。所以,我认为我应该手动分配它,执行以下步骤:
Translation
实体id
表translations
值
这是最合适的方式吗?我是原子地做的吗?
答案 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
(以获得所需的索引)。