我有一个应用程序,它使用hibernate/JPA来实现持久性。它使用Spring。
一些持久化bean依赖于从REST服务中检索的外部对象。
此REST服务的客户端存根是注册的Spring服务。
我想在hibernate加载过程中包装这些外部对象的加载。这样,我确信在加载之后,即使通过复杂的HQL查询获得这些对象,我的对象也始终是有效的。
问题是,无论我使用什么方法,我都很难在我的持久化bean中获得Spring应用程序上下文(以及REST客户端)。
我尝试了以下几点:
目前,我正在使用一种肮脏的解决方案:提供静态getter的ApplicationHolder Spring服务,使Spring之外的对象能够访问它。
对于如何使hibernate或持久化bean上下文具有感知性,您有什么最佳实践吗?
THks
编辑
在DAO中这样做是我的第一种方法,但实际上我有许多需要获取的子对象,如下所示:
LocalObject
* - localSubObject1
- refToExternalObject ----------> externalObject1
* - localSubObject2
- refToExternalObject ----------> externalObject2
- refToExternalObject ----------> externalObject3我希望我的LocalObject有一个一致的,干净的负载。
这样,我就可以在DAO中编写复杂的HQL,而不再为外部对象获取而烦恼了。
发布于 2013-01-04 17:19:30
如果您不想在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 (在配置中或通过积分器)的替代方法不能与Spring一起使用,因为它们是直接实例化的(如本废弃JIRA入口中提到的)。
希望这能有所帮助。
发布于 2013-01-04 16:24:27
给出一个简单的解决方案,来解释我的评论:
@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;
}
}https://stackoverflow.com/questions/14160385
复制相似问题