Java Spring与静态上下文有什么关系
我从DAO方法和sessionFactory中删除了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
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上添加一个存储库注释。举个例子,你可以从