我正在使用Spring事务,因此在将POJO转换为DTO时事务仍然处于活动状态。
我想防止Dozer触发懒加载,以便隐藏的SQL查询永远不会发生:所有获取操作必须通过HQL显式完成(以获得最佳的性能控制)。
这是一种好的做法吗(我找不到任何文档)?
如何安全地实现它?
在DTO转换之前,我尝试了以下操作:
PlatformTransactionManager tm = (PlatformTransactionManager) SingletonFactoryProvider.getSingletonFactory().getSingleton("transactionManager");
tm.commit(tm.getTransaction(new DefaultTransactionDefinition()));
我不知道事务发生了什么,但是Hibernate会话没有关闭,而且仍然发生了延迟加载。
我尝试过这个:
SessionFactory sf = (SessionFactory) SingletonFactoryProvider.getSingletonFactory().getSingleton("sessionFactory");
sf.getCurrentSession().clear();
sf.getCurrentSession().close();
在应用程序层直接操作会话(session),这是否是一个好的实践方式(在我的项目中称为"facade")?我应该担心哪些负面影响?(我已经看到涉及POJO->DTO转换的测试不能再通过AbstractTransactionnalDatasource Spring测试类来运行,因为这些类会尝试在不再与活动会话关联的事务上触发回滚。)
我还尝试将传播(propagation)设置为NOT_SUPPORTED或REQUIRES_NEW,但它会重用当前的Hibernate session,并且无法防止惰性加载。