我从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();
}
}
}
UPDATE
我找到一个快速的方法通过更换错误行来解决这个问题:
new ServiceOrderDAO().updatePrice(paramServiceAction.getServiceOrderFk().longValue());
现在,它不是一个静态调用。
UPDATE 2
我有很多DAO类和多个控制器。考虑到Spring架构,我必须尽快修复最小代码更改。我有一个DAO调用一个或多个DAO来执行一些复杂的查询。
正如之前所述:创建DAO的新实例会导致不可预知的Spring会话行为。
看来我的控制器也有DAO类的调用。
解决这个问题最简单的方法是什么(用最少的代码修改)?
UPDATE 3
端向上注入到DAO的DAO和控制器。这似乎是速战速决,但是从概念观点我怀疑,这是最好的解决办法...
'updatePrice'不是'静态'方法,但你试图静态调用它...请搜索错误消息。 –
除非声明常量,否则请尽量不要使用'static'。在所有其他情况下,避免它。你的Dao不应该是静态的,它不应该有静态方法。它是一个spring bean,需要用spring来实例化,以便事务方面可以将调用拦截到它的方法 - 如果它以任何方式静态,这不会发生。 –
你应该从春季开始(通常是将它注入你的控制器,或者直接引用spring的上下文)来获得Dao。如果您按照以上所述创建新实例,那么您的交易将无法工作。 –