我正在使用 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();
它可以防止延迟加载,但是直接在应用程序层(在我的项目中称为“外观”)中操作会话是一种好习惯吗?我应该害怕哪些负面影响?(我已经看到涉及 POJO -> DTO 转换的测试不能再通过 AbstractTransactionnalDatasource Spring 测试类启动,因为这些类试图触发不再链接到活动会话的事务的回滚)。
我还尝试将传播设置为 NOT_SUPPORTED 或 REQUIRES_NEW,但它会重用当前的 Hibernate 会话,并且不会阻止延迟加载。