2012-04-17 64 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