防止推土机触发休眠延迟加载
我正在使用Spring事务,因此当POJO到DTO转换发生时,事务仍然处于活动状态。
我想防止Dozer触发延迟加载,以便隐藏的sql查询永远不会发生:所有提取都必须通过HQL显式完成(以获得对性能的最佳控制)。
这是一个好的做法吗(我在任何地方都找不到它的记录)?
如何安全地做到这一点?
我在DTO转换之前尝试过这个:
PlatformTransactionManager tm = (PlatformTransactionManager) SingletonFactoryProvider.getSingletonFactory().getSingleton("transactionManager");
tm.commit(tm.getTransaction(new DefaultTransactionDefinition()));
我不知道事务会发生什么,但是休眠会话没有关闭,延迟加载仍然发生。
我试过这个:
SessionFactory sf = (SessionFactory) SingletonFactoryProvider.getSingletonFactory().getSingleton("sessionFactory");
sf.getCurrentSession().clear();
sf.getCurrentSession().close();
它防止了延迟加载,但是直接在应用程序层(在我的项目中称为“外观”)中操作会话是一种很好的做法吗?我应该担心哪些负面副作用?(我已经看到,涉及POJO ->DTO转换的测试不能再通过抽象事务数据库数据源Spring测试类启动,因为这些类试图在不再链接到活动会话的事务上触发回滚)。
我还尝试将传播设置为NOT_SUPPORTED或REQUIRES_NEW,但它重用了当前的Hibernate会话,并且不会阻止延迟加载。