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

Java Spring与静态上下文有什么关系,java,spring,static,Java,Spring,Static,我从DAO方法和sessionFactory中删除了static。现在IDE让我切换回使用静态DAO方法,因为它说非静态方法updatePrice(long)不能从静态上下文中引用。这两个类都不包含static关键字。发生了什么?如何修复它 ServiceActionDAO @Transactional public class ServiceActionDAO{ @Autowired SessionFactory sessionFactory; public void insert

我从DAO方法和sessionFactory中删除了
static
。现在IDE让我切换回使用静态DAO方法,因为它说非静态方法updatePrice(long)不能从静态上下文中引用。这两个类都不包含static关键字。发生了什么?如何修复它

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和控制器。这看起来像是权宜之计,但从概念的角度来看,我怀疑这是最好的解决方案……

你也可以

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

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

无论哪种方式,您都必须制作DAOs和spring管理的bean

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

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


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

updatePrice
不是一个
静态方法,但您试图静态调用它……请搜索错误消息。请尽最大努力不要使用
静态方法,除非在声明常量时。在所有其他情况下,避免使用它。Dao不应该是静态的,也不应该有静态方法。它是一个Springbean,需要用spring进行实例化,以便事务性方面能够拦截对其方法的调用——如果它是静态的,就不会发生这种情况。您应该以某种方式从spring获取Dao(通常通过将其注入控制器或直接引用spring上下文)。如果你像上面那样创建一个新实例,你的事务将无法工作。你能给出一个快速的示例代码吗?我有``所以我想我的刀都是春豆。对吗?@RCola:您需要在DAO上添加一个存储库注释。举个例子,你可以从