我正在处理现有的事件表:
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,就像现在一样。
答案 0 :(得分:3)
读取操作不应该导致任何问题:创建EventType
实体,在Event
和EventType
之间添加一个私人热切的多对一关系,放置{{1在二级缓存中,添加一个getter,在EventType
中返回事件类型的名称。这使得它对应用程序的其余部分透明,并且由于二级缓存而不会导致额外的选择。
插入更难,因为您可能不希望让您的实体访问会话以使新事件类型持久。即使这是可以接受的,我想你想要对事件类型名称有一个唯一约束,如果同时创建两个具有相同新事件类型的事件,这可能会使某些事件创建失败。
我会创建一个服务,根据名称“获取或创建”事件类型。此服务将使用专用事务来创建事件类型,以减少冲突的可能性。每当我需要为事件分配一个事件类型时,我会使用这个服务(我想,这应该比阅读事件类型的频率低得多)。