我正在从事的项目使用 Hibernate 进行持久化。
该项目分为子项目,其中四个与此处相关:
- 消息域
- 用户服务
- 消息服务
- 案例服务
消息实体(在 user-dom 中)包含一个 String userID
字段和一个 @Transient String userName
字段。另一个实体 Case 与 Message 具有 OneToOne 关系。问题如下:
- 每次我们加载消息(无论是直接在消息服务中,还是通过在案例服务中间接加载案例),我们都需要设置其 userName 字段。
- 通过调用用户服务来检索用户名。
- 无法从 message-dom 调用用户服务(由于依赖性原因)。
我已经看到实体有一个 @PostLoad
注释,但显然这些注释在这里没有帮助,因为我们无法从实体调用服务。目前我们手动进行服务调用,但这很容易出错(特别是在案例内间接加载消息时)。
我们如何确保每次加载消息实体时都会设置该字段?
最佳答案
在所有部分组合在一起的最终应用程序中实现 org.hibernate.event.PostLoadEventListener
并通过xml添加
<hibernate-configuration>
<session-factory>
...
<event type="load">
<listener class="com.eg.MyPostLoadListener"/>
<listener class="org.hibernate.event.def.DefaultPostLoadEventListener"/>
</event>
</session-factory>
</hibernate-configuration>
或通过代码
Configuration cfg = new Configuration();
PostLoadEventListener[] stack = { new MyPostLoadListener(), new DefaultPostLoadEventListener() };
cfg.EventListeners().setPostLoadEventListeners(stack);
关于java - 加载 hibernate 实体时始终调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13606258/