1

我有这样的类层次结构

public class AccessHistoryJpaDAO extends PaginatedJpaDAO<AccessHistory, Long>
implements AccessHistoryDAO

在 AccessHistoryJpaDAO 中,我实现了在 AccessHistoryDAO 接口中声明的 logIn 方法。

public void logIn(AccessHistory entity) throws DAOException
{
    super.save(entity);     
}

然后我扩展了spring的AuthenticationProcessingFilter

公共类 CustomAuthenticatingFilter 扩展了 AuthenticationProcessingFilter

和覆盖的方法

@Override
public Authentication attemptAuthentication(HttpServletRequest request)
        throws AuthenticationException

在我打电话的时候用这个方法

getAccessHistoryDAO().logIn(entity);

hibernate 不能持久化实体但是当我直接调用

getAccessHistoryDAO().save(entity)

上面的方法是持久实体,我试图弄清楚但没有线索,任何帮助将不胜感激。谢谢你。

4

1 回答 1

0

它看起来像是 Proxy-AOP 的一个众所周知的问题。

我猜你在方法上有一个@Transactional注释。save但是只有在从 OTHER spring bean 调用该方法时才考虑这个 Annotation。如果它是从同一个 spring bean ( this.save()) 调用的,则不会调用 AOP 代理,因此不会启动 Transaction。

您可以通过至少三种不同的方式处理该问题:

  • 在方法上添加附加@Transactional注释logIn,或
  • 使用显式事务管理而不是声明式,
  • 使用真正的 AspectJ 而不是 Spring Proxy-AOP(这就是我所做的)
于 2012-04-17T11:46:54.857 回答