Spring与静态上下文有什么关系

时间:2014-06-16 17:34:54

标签: java spring static

我从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和控制器。这似乎是快速修复,但从概念的角度来看,我怀疑这是最好的解决方案......

1 个答案:

答案 0 :(得分:2)

你可以

a)将ServiceOrderDAO的引用注入ServiceActionDao,并在注入的DAO实例上调用该方法,或者

b)您可以引入一个服务层,该服务层在同一个事务中调用两个DAO,其中每个DAO都注入到服务中。

无论哪种方式,您都必须制作两个DAO弹簧管理的bean。

如果您需要从另一个DAO调用一个DAO,似乎引入服务将是一个合适的解决方案。

此外,提交和回滚是不必要的,甚至适得其反。使用Spring时,您应该能够毫无问题地删除此代码。

创建DAO的新实例并不是一个很好的解决方案,因为它不是Spring管理的bean。如果它具有自动装配的属性,那么这些属性将不会被设置。如果它使用自己的SessionFactory,与自动连接的SessionFactory不同,那么你会得到奇怪的行为,因为它将使用与Spring管理的DAO不同的会话。