2016-03-26 7 views
1

私はJava Spring MVCプロジェクトに取り組んでいます。コントローラがDAIImplクラスを呼び出すServiceImplクラス(updateAttempt())のメソッドを呼び出すと、更新が行われ、更新されたデータがDBに表示されます。サービスクラス内で呼び出されたときにサービスクラスがデータベースを更新しない

しかしServiceImplクラスに存在するloadUserByUserNameが同じServiceImplクラスのupdateAttempt()メソッドを呼び出すと、エラーまたは例外はスローされませんが、データはDB内で決して更新されません。

PersonController.java

@Controller 
    @SessionAttributes({ "mob_Number"}) 
    public class PersonController implements Observer, InitializingBean{ 

     private static final Logger logger = LoggerFactory.getLogger(PersonController.class); 

     private PersonService personService; 

     @Autowired(required=true) 
     @Qualifier(value="personService") 
     public void setPersonService(PersonService ps){ 
      this.personService = ps; 
     } 

     public PersonController(PersonService personService){ 
      this.personService = personService; 
     } 

     public PersonController(){ 

     } 

      @RequestMapping(value="/submitVerificationCode",method = RequestMethod.POST, headers = "Accept=application/json") 
    @ResponseBody 
    public String submitVerificationCode(@RequestBody String json){ 
...... 
      this.personService.update_User_Verification_AttemptCount(userVer.getMobile_Number(), no_Attempts); 
       //this call updates the data in DB 
    } 


} 

PersonServiceImpl.java

@Service 
public class PersonServiceImpl implements PersonService, UserDetailsService { 

    private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class); 

    private PersonDAO personDAO; 

    private PersonService personService; 

    public void setPersonDAO(PersonDAO personDAO) { 
     this.personDAO = personDAO; 
    } 

    @Autowired 
    private Observer observe; 

     @Override 
    @Transactional 
    public void update_User_Verification_AttemptCount(String mobile_number, int count){ 
     this.personDAO.update_User_Verification_AttemptCount(mobile_number, count); 
    } 

    @Override 
    @Transactional 
    public UserDetails loadUserByUsername(String mobile_Number) 
      throws UsernameNotFoundException { 



      this.update_User_Verification_AttemptCount(mobile_Number, no_Attempts); //but this call doesn't update the data in DB 

      this.getUserDetails() //but this call returns data from DB 

    } 

PersonDAOImpl.java

@Repository 
public class PersonDAOImpl implements PersonDAO { 

    private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class); 

    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sf){ 
     this.sessionFactory = sf; 
    } 

     @Override 
    public void update_User_Verification_VerCode(String mob_number, String verCode, Timestamp currentTimestamp){ 
     Session session = this.sessionFactory.getCurrentSession(); 
     Query query = session.createQuery("update UserVerification set ver_Code=:verCode, sent_Time=:currentTimestamp where mobile_Number=:mob_Number"); 
     query.setParameter("verCode", verCode); 
     query.setParameter("currentTimestamp", currentTimestamp); 
     query.setParameter("mob_Number", mob_number); 
     query.executeUpdate(); 
     session.flush(); 
    } 

}     

注:(選択しない)ServiceImplに存在するgetメソッドも値を返しますloadUserByUsernameからgetメソッドが呼び出されたときに正しく呼び出されます。

+0

あなたが 'commit'メソッドを呼び出すことを希望します。 – Vishrant

+0

私はあなたを得ない。 ???の 'Commit'メソッド – user3705478

答えて

1

同じサービス内のメソッドを呼び出すと、トランザクションがコミットされないためです。

Springは、Beanをプロキシ内部にラップし、それにビヘイビアを追加することで、トランザクションの振る舞いでBeanを豊かにするという問題があります。ただし、プロキシは常にインターフェイスの周りに作成されるため、thisキーワードでメソッドを呼び出すと、目的の動作が伝播されません。

適切な解決策は、同じサービスメソッドの呼び出しを避けるために、そのDAOコールを繰り返すだろう

@Transactional 
    public UserDetails loadUserByUsername(String mobile_Number) 
      throws UsernameNotFoundException { 

this.personDAO.update_User_Verification_AttemptCount(mobile_number, count); 

      this.getUserDetails() //but this call returns data from DB 

    } 

もう一つのあなたが行うことができます(ハックの事)あなたはすでに内部personServiceを持っているので、ありますPersonServiceImplは、まずそのが注入されていることを確認し、そう@Autowired

@Autowired private PersonService personService; 

を追加し、よりインターフェースなどを介してコールをすることです

​​
+0

お返事ありがとうございます。最初のオプションでもデータベースは更新されません。私は 'personServiceimpl'中の' personDAO'がnullに設定されているので、 'this.personDAO.update_user_Authentication(nullのポインタ例外が発生しました。' 'PersonServiceImpl.java'の 'update_User_Verification_AttemptCount'の内部にあります。 ); – user3705478

+0

はい、DAOとサービスは、@ Autowireで注釈を付けなくても注入されることを期待していると思います。 Daoはnullで、DAOの横に注釈を追加するか、コントローラで行ったようにセッターに注釈を追加することで修正できます。 –

関連する問題