Hibernate,指定多列为主键

问题描述 投票:0回答:1

我有以下数据库架构。

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。

我尝试在休眠中对此进行建模,但复合键不允许生成器按照模式存在。我需要 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 元素才能有生成器。但在这种情况下,我有两个发电机。有解决方法吗?

database nhibernate hibernate database-design
1个回答
3
投票

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

这应该可以帮助您开始。 休眠 ID 生成器

编辑-- 我强烈建议您使用代理键,如 hibernate 文档中所建议的那样。如果你不这样做,你就会冒着让事情变得比他们需要的更困难的风险。 您仍然可以将版本控制方案建模为自然键并进行查询。

编辑您的更新--

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

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

您现在可以为复合键的一部分指定任何生成器。那很甜蜜。

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

© www.soinside.com 2019 - 2024. All rights reserved.