2010-07-22 44 views
3

我有下面的数据库模式。休眠,分配多个列作为主键

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元素可以有发生器。但在这种情况下,我有两台发电机。有没有解决这个问题的方法。

谢谢
巴拉

回答

3

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

这应该让你开始。 Hibernate ID Generator

edit-- 我强烈建议您按照hibernate文档中的建议使用代理键。如果你不这样做,你就会冒险做出比他们需要的更困难的事情lot

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

编辑为您update--

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

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

您现在可以指定任何生成的组合键的一部分。这很漂亮。

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

+0

我以为太多的替代品和一点困惑。你能提供一个例子吗? – Boolean 2010-07-22 21:36:12

+0

@algorist自然键的例子或自定义休眠类型的例子? 自然的重要文件是在这里 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-naturalid 它很容易。 自定义hibernate类型的例子并不那么平凡。 – hvgotcodes 2010-07-22 21:39:24

+0

你可以看看现在的问题。 – Boolean 2010-07-22 22:43:19