我从DAO方法和sessionFactory中删除了static
。现在IDE让我切换回使用静态DAO方法,因为它说Non-static method updatePrice(long) cannot be referenced form a static context
。这两个类都不包含静态关键字。怎么了?如何解决?
ServiceActionDAO
@Transactional
public class ServiceActionDAO{
@Autowired
SessionFactory sessionFactory;
public void insert(ServiceActionEntity paramServiceAction){
Transaction localTransaction = null;
try{
Session localSession = sessionFactory.getCurrentSession();
localSession.save(paramServiceAction);
localSession.getTransaction().commit();
ServiceOrderDAO.updatePrice(paramServiceAction.getServiceOrderFk().longValue());// error
}
catch (Exception localException){
if (localTransaction != null) {
localTransaction.rollback();
}
}
}
更新
通过将错误行替换为:
,我找到了解决此问题的快捷方法new ServiceOrderDAO().updatePrice(paramServiceAction.getServiceOrderFk().longValue());
现在不是静态电话。
更新2
我有很多DAO类和一些控制器。考虑到Spring架构,我必须找到最小代码更改的快速修复。我有一个DAO调用一个或多个DAO来执行一些复杂的查询。
如前所述:创建DAO的新实例会导致不可预测的Spring会话行为。
我的控制器似乎也调用了DAO类。
解决此问题的最简单方法(使用最少的代码更改)是什么?
更新3
结束将DAO注入DAO和控制器。这似乎是快速修复,但从概念的角度来看,我怀疑这是最好的解决方案......
答案 0 :(得分:2)
你可以
a)将ServiceOrderDAO的引用注入ServiceActionDao,并在注入的DAO实例上调用该方法,或者
b)您可以引入一个服务层,该服务层在同一个事务中调用两个DAO,其中每个DAO都注入到服务中。
无论哪种方式,您都必须制作两个DAO弹簧管理的bean。
如果您需要从另一个DAO调用一个DAO,似乎引入服务将是一个合适的解决方案。
此外,提交和回滚是不必要的,甚至适得其反。使用Spring时,您应该能够毫无问题地删除此代码。
创建DAO的新实例并不是一个很好的解决方案,因为它不是Spring管理的bean。如果它具有自动装配的属性,那么这些属性将不会被设置。如果它使用自己的SessionFactory,与自动连接的SessionFactory不同,那么你会得到奇怪的行为,因为它将使用与Spring管理的DAO不同的会话。