gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:12 25 4
gpt4 key购买 nike

我有一个应用程序使用 hibernate/JPA 进行持久化。它使用 Spring
一些持久化 bean 依赖于我从 REST 服务中检索到的外部对象

此 REST 服务的客户端 stub 是一个已注册的 Spring 服务

我想在 hibernate 加载过程中包装那些外部对象的加载。这样,我就可以确定我的对象在加载后始终有效,即使我通过复杂的 HQL 查询获取这些对象也是如此。

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

我尝试了以下方法:

  • 使用 UserType 通过他们的 ID 从 REST 获取我的对象:
    CustomUserType 由 Hibernate 实例化,因此不会发生 Spring 注入(inject)。
  • 使用@AfterLoad JPA注解:
    这个更糟,没有可用的 EntityManager、Session 或 Spring 上下文
  • 用户LifeCycle接口(interface),onLoad(Session s, Serializable id)方法:
    我可以访问这里的 session 。但我不知道如何制作一个 ApplicationContext 可识别的自定义 session 。

目前,我正在使用一个肮脏的解决方法:一个 ApplicationHolder Spring 服务,它提供一个静态 getter,让 Spring 世界之外的对象可以访问它。

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

感谢

编辑

在我的 DAO 中这样做是我的第一种方法,但实际上我有很多子对象需要获取,就像这样:

LocalObject
* - localSubObject1
- refToExternalObject ----------> externalObject1
* - localSubObject2
- refToExternalObject ----------> externalObject2
- refToExternalObject ----------> externalObject3

我希望我的 LocalObject 具有一致、干净的负载。

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

最佳答案

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

@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 的替代方法(在配置中或通过 Integrators )不能与 Spring bean 一起使用,因为它们是直接实例化的(如本 abandoned JIRA entry 中所述) .

希望对您有所帮助。

关于java - 如何使托管实体上下文感知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com