首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使托管实体上下文感知?

如何使托管实体上下文感知?
EN

Stack Overflow用户
提问于 2013-01-04 15:52:46
回答 2查看 475关注 0票数 2

我有一个应用程序,它使用hibernate/JPA来实现持久性。它使用Spring

一些持久化bean依赖于从REST服务中检索的外部对象。

此REST服务的客户端存根是注册的Spring服务

我想在hibernate加载过程中包装这些外部对象的加载。这样,我确信在加载之后,即使通过复杂的HQL查询获得这些对象,我的对象也始终是有效的。

问题是,无论我使用什么方法,我都很难在我的持久化bean中获得Spring应用程序上下文(以及REST客户端)。

我尝试了以下几点:

  • 使用UserType通过它们的ID从REST获取我的对象: CustomUserType由Hibernate实例化,因此不会发生Spring注入。
  • 使用@AfterLoad JPA注释: 更糟糕的是,没有EntityManager、会话或Spring上下文
  • 用户LifeCycle接口,onLoad(会话的,可序列化的id)方法: 我可以进入这里的会议。但是,我不知道如何使自定义会话能够被ApplicationContext识别。

目前,我正在使用一种肮脏的解决方案:提供静态getter的ApplicationHolder Spring服务,使Spring之外的对象能够访问它。

对于如何使hibernate或持久化bean上下文具有感知性,您有什么最佳实践吗?

THks

编辑

在DAO中这样做是我的第一种方法,但实际上我有许多需要获取的子对象,如下所示:

代码语言:javascript
复制
LocalObject
* - localSubObject1
    - refToExternalObject ----------> externalObject1
* - localSubObject2 
    - refToExternalObject ----------> externalObject2
    - refToExternalObject ----------> externalObject3

我希望我的LocalObject有一个一致的,干净的负载。

这样,我就可以在DAO中编写复杂的HQL,而不再为外部对象获取而烦恼了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 17:19:30

如果您不想在Dao中这样做,那么也许可以这样做:

代码语言:javascript
复制
@Component
public class MyPostLoadEventListener implements PostLoadEventListener {

    @Resource
    private SessionFactoryImpl sessionFactoryImpl;
    @Resource
    private RestClient restClient;

    @PostConstruct
    public void installAsEventListener() {
        sessionFactoryImpl.getServiceRegistry()
                              .getService(EventListenerRegistry.class)
                              .getEventListenerGroup(EventType.POST_LOAD)
                              .appendListener(this);
    }

    @Override
    public void onPostLoad(PostLoadEvent event) {
        if (event.getEntity() instanceof LocalObject) {
            // fill with data from RestClient
        }
    }
}

这有点麻烦,但不幸的是,注册Hibernate EventListeners (在配置中或通过积分器)的替代方法不能与Spring一起使用,因为它们是直接实例化的(如本废弃JIRA入口中提到的)。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-01-04 16:24:27

给出一个简单的解决方案,来解释我的评论:

代码语言:javascript
复制
@Component
public class HibernateDao {

    @Resource
    private SessionFactory sessionFactory;
    @Resource
    private RestClient restClient;


    public LocalObject loadLocalObject(Serializable id) {
        LocalObject localObject = sessionFactory.getCurrentSession().load(id);
        ExternalObject externalObject = restClient.getExternalObject(id);

        localObject.setVal(externalObject.getVal())
        // ... more of this ...

        return localObject;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14160385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档