【发布时间】:2011-07-29 23:19:01
【问题描述】:
我正在使用 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 会话,并且不会阻止延迟加载。
【问题讨论】:
标签: java hibernate spring dozer spring-transactions