2012-04-17 71 views
1

我班的层次结构是这样无法如果与弹簧AuthenticationProcessingFilter扩展类坚持实体JPA

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

我实现了这是在AccessHistoryDAO接口中声明登录方法。

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

然后,我在此方法扩展春天AuthenticationProcessingFilter

和重写的方法

@Override 
public Authentication attemptAuthentication(HttpServletRequest request) 
     throws AuthenticationException 

公共类CustomAuthenticatingFilter扩展AuthenticationProcessingFilter当我打电话

getAccessHistoryDAO().logIn(entity); 

Hibernate是不能坚持的实体,而是 当我打电话照片直接

getAccessHistoryDAO().save(entity) 

以上方法是坚持实体,以及我揣摩出来,但没有任何线索,任何帮助将不胜感激。谢谢。

+0

有一件事我忘记了,没有任何异常或奇怪的行为,这是hibernate n表示成功插入但是表中没有行的id的实体。但是,只要我调用getAccessHistoryDAO()。save(entity),表中就有一行。 – 2012-04-17 09:44:33

+0

它是否抛出任何异常或实体只是不持久? – sinuhepop 2012-04-17 10:28:12

+0

在Ralph提到的这种情况下,不会有任何异常,但hibernate不会启动事务处理,因此数据库中不会插入任何记录 – 2012-04-17 12:07:46

回答

0

它看起来像Proxy-AOP一个非常有名的问题。

我想你在save方法有一个@Transactional注释。但是,如果从其他spring bean调用该方法,则只会考虑此注释。如果从同一个spring bean(this.save())中调用它,则不调用AOP代理,因此事务未启动。

可以在至少三种不同的方式处理这个问题:

  • 把额外@Transactional注释在logIn方法,或
  • 使用显式事务管理,而不是声明,
  • 使用真正的AspectJ而不是Spring Proxy-AOP(这是我所做的)
+0

感谢您的回复其实您是对的我错过了@Transactional – 2012-04-17 12:03:31