在加载hibernate实体时总是调用方法

时间:2012-11-28 13:32:40

标签: java hibernate

我正在开发的项目使用Hibernate进行持久化。

该项目分为子项目,其中四个与此相关:

  • 消息DOM
  • 用户服务
  • 消息的服务
  • 区分服务

Message实体(在user-dom中)包含String userID字段和@Transient String userName字段。另一个实体Case与Message有一个OneToOne关系。问题如下:

  • 每次我们加载一条Message(直接,在message-service中,或通过在case-service中加载一个Case来间接加载),我们需要设置它的userName字段。
  • 通过调用用户服务来检索userName。
  • 无法从message-dom调用用户服务(出于依赖性原因)。

我已经看到实体有一个@PostLoad注释,但显然这些没有帮助,因为我们无法从实体调用服务。目前我们手动进行服务调用,但这很容易出错(特别是在Case中间接加载Message时)。

我们如何确保每次加载Message实体时都设置字段?

1 个答案:

答案 0 :(得分:3)

在最终应用程序中,所有部件组合在一起,实现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);