如何在Hibernate中映射查找表以获取半静态数据

时间:2011-06-28 19:49:24

标签: java sql oracle hibernate normalization

我正在处理现有的事件表:

Event Table:
id    event_type          status    ...
==    ==========          ======
 1    high.temperature    ACCEPTED
 2    missing.invoice     WAITING
 3    missing.invoice     WAITING

目前有几百个event_types和五个状态。这个表有数百万行,我想通过使用event_type和status的查找表来减小它的大小。状态很好,因为它具有少量静态值,但event_type由外部​​系统控制,并且我的系统有时会接收事件,并且必须将新值添加到查找表中。

我认为选择现有的表结构是为了使hibernate的映射变得容易,但它做得很好,但会产生很多冗余。

我想要的是这样的:

Event Table:
id    event_type    status   ...
==    ==========    ======
 1    223           3
 2    245           4
 3    245           4

EventType Table:
event_type    name  
==========    ================  
223           high.temperature
245           missing.invoice

我的问题是,是否有任何方法可以自动插入和从查找表中选择,这样我就不必为EventType定义Java类并查找相应的每次插入Event时EventType?在java方面,我更愿意将event_type视为普通的String,就像现在一样。

1 个答案:

答案 0 :(得分:3)

读取操作不应该导致任何问题:创建EventType实体,在EventEventType之间添加一个私人热切的多对一关系,放置{{1在二级缓存中,添加一个getter,在EventType中返回事件类型的名称。这使得它对应用程序的其余部分透明,并且由于二级缓存而不会导致额外的选择。

插入更难,因为您可能不希望让您的实体访问会话以使新事件类型持久。即使这是可以接受的,我想你想要对事件类型名称有一个唯一约束,如果同时创建两个具有相同新事件类型的事件,这可能会使某些事件创建失败。

我会创建一个服务,根据名称“获取或创建”事件类型。此服务将使用专用事务来创建事件类型,以减少冲突的可能性。每当我需要为事件分配一个事件类型时,我会使用这个服务(我想,这应该比阅读事件类型的频率低得多)。