Java 如何在Hibernate中映射半静态数据的查找表
我正在处理一个现有的事件表:Java 如何在Hibernate中映射半静态数据的查找表,java,sql,oracle,hibernate,normalization,Java,Sql,Oracle,Hibernate,Normalization,我正在处理一个现有的事件表: Event Table: id event_type status ... == ========== ====== 1 high.temperature ACCEPTED 2 missing.invoice WAITING 3 missing.invoice WAITING 目前有几百种事件类型和五种状态。这个表有数百万行,我想通过使用事件类型和状态的查找表来减小
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时都查找相应的EventType?在java方面,我更愿意将事件类型视为一个普通字符串,就像现在一样。读取操作应该不会引起任何问题:创建一个
EventType
实体,在event
和EventType
之间添加一个私有的急切获取的多对一关系,将EventType
放在二级缓存中,并在event
中添加一个返回事件类型名称的getter。这使得它对应用程序的其余部分是透明的,并且不会由于二级缓存而导致额外的选择
不过,插入比较困难,因为您可能不想让实体访问会话以使新的事件类型持久化。即使这是可以接受的,我想您也希望对事件类型名称有一个唯一的约束,如果同时创建两个具有相同新事件类型的事件,可能会导致某些事件创建失败
我将创建一个基于名称“获取或创建”事件类型的服务。此服务将使用专用事务创建事件类型,以减少冲突的可能性。每次我需要为事件指定事件类型时,我都会使用此服务(我想,这应该比读取事件类型的频率低得多)。谢谢您的帮助。“获取或创建”服务正是我所想的,但我希望我能找到一种更自动的方式来进行这些更新,也许是一些神奇的Oracle功能,可以基于FK为我插入到查找表中。