【问题标题】:How to Map Lookup Tables in Hibernate for Semi-Static data如何在 Hibernate 中为半静态数据映射查找表
【发布时间】:2023-03-21 02:20:01
【问题描述】:

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

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

目前有几百个 event_types 和五个状态。这个表有数百万行,我想通过使用 event_type 和 status 的查找表来减小它的大小。 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 类并查找适当的每次插入事件时的事件类型?在 java 方面,我更愿意将 event_type 视为普通字符串,就像现在一样。

【问题讨论】:

    标签: java sql oracle hibernate normalization


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的帮助。 “获取或创建”服务几乎是我的想法,但我希望我能找到一种更自动的方式来进行这些更新,也许是一些基于 FK 为我插入查找表的神奇 Oracle 特性。
    猜你喜欢
    • 2014-02-03
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2011-07-26
    相关资源
    最近更新 更多