database - Hibernate,将多个列分配为主键

标签 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 的生成器。我如何在 hibernate 模式中对此进行建模。

我在这一步被阻止了:(任何帮助将不胜感激。

谢谢 巴拉

-- 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)

我认为这种方法会奏效。但是,我不确定如何在 hibernate 状态下执行此操作。

只有 ID 元素可以有生成器。但在这种情况下,我有两个发电机。是否有解决方法。

谢谢
巴拉

最佳答案

您需要一个自定义 hibernate 类型和一个自定义 ID 生成器。我认为没有任何办法解决这个问题。

这应该可以帮助您入门。 Hibernate ID Generator

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

您仍然可以将您的版本控制方案建模为自然键并对其进行查询。

为您的更新编辑--

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

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

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

我仍然认为您最好的选择是使用代理键来让 hibernate 快乐并让您的生活更轻松,并使用自然键来满足您的业务需求。

关于database - Hibernate,将多个列分配为主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313528/

相关文章:

ruby-on-rails - Rails 找不到刚创建的数据库列

c# - NHibernate - 在删除时将引用设置为空

java - postgres 中的大量 SHOW TRANSACTION ISOLATION LEVEL 查询

java - Hibernate:复杂对象的初始化

sql - 按列中的行号分组

php - 安全本地 mysql 访问

database - "No function matches the given name and argument types"用于自定义功能

c# - Nhibernate envers,使用依赖注入(inject)将用户添加到修订实体中

nhibernate - 如何使用 NHibernate 插入或更新(或覆盖)记录?

java - 在Java中,Spring无需任何脚本即可维护数据库