防止Dozer触发Hibernate延迟加载
我正在使用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();
它可以防止延迟加载,但是直接在应用程序层(在我的项目中称为“facade”)中操作会话是一种很好的做法吗?我应该担心哪些负面影响? (我已经看到涉及POJO - > DTO转换的测试无法通过AbstractTransactionnalDatasource Spring测试类启动,因为这些类尝试触发对不再链接到活动会话的事务的回滚)。
我还尝试将传播设置为NOT_SUPPORTED或REQUIRES_NEW,但它重用当前的Hibernate会话,并且不会阻止延迟加载。
没有找到相关结果
已邀请:
6 个回复
壤欠攻混
这将返回任何未初始化的PersistentSet对象为null。我这样做,以便当它们传递给客户端时,我可以区分NULL(非加载)集合和空集合。这允许我在客户端中定义通用行为以使用预加载的集合,或者进行另一个服务调用以检索集合(如果需要)。此外,如果您决定在服务层内急切加载任何集合,那么它们将照常映射。 我使用spring注入自定义字段映射器:
我希望这可以帮助任何人寻找解决方案,因为我在搜索互联网时没有找到任何例子。
咖哀烈
}
傻零凰死授
替秀宝
一个懒惰加载集合的调用,就像你自己访问这些属性一样。 任何让Dozer知道你的bean中的Hibernate代理的技巧,反之亦然,IMO会打破你的应用层。 如果您不希望在意外时间触发任何“隐藏的SQL查询”,只需禁用延迟加载。
钾涎净介
靛取糕奖穿