gpt4 book ai didi

java - 在服务类中调用时服务类不更新数据库

转载 作者:行者123 更新时间:2023-11-30 07:30:21 26 4
gpt4 key购买 nike

我正在开发 Java Spring MVC 项目。当 Controller 调用 ServiceImpl 类 (updateAttempt()) 中的方法(updateAttempt()),而该方法又调用 DAOImpl 类时,更新就会发生,我会在 DB 中看到更新的数据。

但是,当 loadUserByUserName(存在于 ServiceImpl 类中)调用同一 ServiceImpl 类中的 updateAttempt() 方法时,它不会抛出任何错误或异常,但数据永远不会在数据库中更新。

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();
}

}

注意:当从 loadUserByUsername 调用 get 方法时,ServiceImpl 中的 get 方法(它确实选择)也会正确返回值。

最佳答案

这是因为当您调用同一服务内的方法时,您的事务不会提交。

问题在于 Spring 通过将 bean 包装在代理内并向其添加行为来丰富 bean 的事务行为。然而,代理始终是围绕接口(interface)创建的,因此使用 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

}

您可以做的另一件事(hacky 事情)是,由于您在 PersonServiceImpl 中已经有一个 personService,首先确保它已注入(inject),所以添加@Autowired

@Autowired private PersonService personService;

然后通过接口(interface)进行调用,例如

  personService.update_User_Verification_AttemptCount(mobile_Number, no_Attempts);  
personService.getUserDetails()

关于java - 在服务类中调用时服务类不更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36231423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com