Hibernate,将多列指定为主键

时间:2010-07-22 21:10:26

标签: database nhibernate hibernate database-design

我有以下数据库架构。

Table:items
item_id int(11) autoincrement not null
item_name varchar(22) not null
version_start_date datetime not null
version_end_date datetime

上表的主键是(item_id,version_start_date)。 version_start_date和version_end_date的语义是跟踪表行的任何更改。就像项目名称被修改一样,然后添加一个新行并更新旧行version_end_date。

我试图在hibernate中对此进行建模,但是复合键不允许按照模式存在生成器。我需要用于itemid的生成器。我如何在休眠模型中进行建模。

我在此步骤被阻止:(任何帮助将不胜感激。

谢谢 巴拉

-- Updated

所以,最后我想到了以下方法。我不想使用自然id,因为我必须生成id。相反,我想在表中也有item_version_id字段。

因此,新架构将是......

Table:items
item_version_id autoincrement not null
item_id int(11) autoincrement not null
item_name varchar(22) not null
version_start_date datetime not null
version_end_date datetime
primary key(item_version_id)
unique key(item_id,version_start_date)

我认为这种方法会起作用。但是,我不知道如何在休眠状态下执行此操作。

只有ID元素才能有生成器。但在这种情况下,我有两台发电机。有没有解决方法。

谢谢你 巴拉

1 个答案:

答案 0 :(得分:3)

您需要一个自定义的休眠类型与自定义ID生成器相结合。我认为没有办法解决这个问题。

这应该让你开始。 Hibernate ID Generator

edit-- 我强烈建议您按照hibernate文档中的建议使用代理键。如果你不这样做,你就有可能使事情变得比他们需要的更难

您仍然可以将版本控制方案建模为自然键并查询它。

编辑您的更新 -

显然现在这是可能的(当我们必须解决这个问题的时候没有回来)

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2060

您现在可以为复合键的一部分指定任何生成器。多数民众赞成。

我仍然认为您最好的选择是使用代理键让休眠变得快乐,让您的生活变得轻松,并且是满足您业务需求的自然钥匙。