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

3

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

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

目前有几百个事件类型和五种状态。这个表有数百万行数据,我想通过使用事件类型和状态的查找表来减小它的大小。状态很好处理,因为它只有少量静态值,但是事件类型由外部系统控制,有时我的系统会接收到具有新值的事件,这些值必须添加到查找表中。

我认为现有的表结构被选择是为了使与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类,并且每次插入事件时都要查找相应的EventType?在Java方面,我希望将event_type视为普通字符串,就像现在一样。
1个回答

3
读取操作不应该引起任何问题:创建一个 EventType 实体,添加一个私有的急切获取的多对一关系,连接 EventEventType,将 EventType 放入二级缓存中,在 Event 中添加返回事件类型名称的 getter。这使得在应用程序的其他部分是透明的,并且由于二级缓存不会导致额外的查询。
然而,插入操作更加困难,因为您可能不希望让实体访问会话以使新事件类型持久化。即使可以接受这一点,我想您也希望为事件类型名称设置唯一约束,如果并行创建两个具有相同新事件类型的事件,则可能会导致某些事件创建失败。
我将创建一个服务,它将基于名称“获取或创建”事件类型。这个服务将使用专用的事务来创建事件类型,以减少冲突的可能性。每当需要为事件分配事件类型时,我都会使用此服务(我猜,这应该比读取事件类型要频率低得多)。

感谢您的帮助。 "获取或创建"服务基本上就是我所想的,但我希望能找到一种更自动化的更新方式,也许是一些神奇的Oracle功能,可以根据外键为我插入查找表。 - James Scriven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接