更改数据库

时间:2017-10-23 07:33:46

标签: java jpa stateless-session-bean

我的问题是更改系统中登录的用户的密码。它打印出新密码已成功更改,但当我检查时,密码保持不变,并且没有更改。是因为我使用set.Password吗?还有其他方法吗?此代码尝试使用用户名检索Employee。

更新:亚历克斯的精彩答案以及其他建议已经解决了这个问题!谢谢你们。

这是调用遥控器的方法

 private void doChangePassword() throws UserNameNotFoundException, EmployeeNotFoundException {


    Scanner scanner = new Scanner(System.in);

    System.out.println("*** Administration Panel :: Change Password ***\n");
    System.out.print("Enter username> ");
    String username = scanner.nextLine().trim();
    System.out.print("Enter current password> ");
    String currentPassword = scanner.nextLine().trim();
    System.out.print("Enter new password> ");
    String newPassword = scanner.nextLine().trim();
    System.out.print("Enter new password again> ");
    String reenterNewPassword = scanner.nextLine().trim();

    currentEmployee = employeeControllerRemote.retrievePasswordByUsername(username);
    if (currentPassword.equals(currentEmployee.getPassword())) {
        if (newPassword.equals(reenterNewPassword)) {
            currentEmployee.setPassword(newPassword);  
            //Updated here
           employeeControllerRemote.updateNewPassword(currentEmployee);

            System.out.println("New Password changed successfully!\n");
        } else {
            System.out.println("New Password mismatched!\n");
        }
    }
    else {
        System.out.println("Wrong password, please try again later");
    }
    }

在另一个程序中,无状态会话bean名为employeeController。此方法也在employeeControllerRemote和local中实现。

@Override
public Employee retrievePasswordByUsername(String username) throws UserNameNotFoundException {

    Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername", Employee.class);
    query.setParameter("inUsername", username);
    return (Employee) query.getSingleResult();
    //Changed it according to suggestions
}

这是我创建的新方法。我试图使用提交,但它没有用。我也尝试使用persist和flush。但它说它是重复的,并且存在非法争议错误。刷新不起作用,错误代码提到没有什么可以刷新。 我创建这个新方法没有把它放在retrievePasswordByUsername方法下,因为我认为它不应该存在,因为它只是检索它?所以我在下面创建了一个新方法。它仍然无法正常工作。

@Override
 public void updateNewPassword(Employee employee) {
    //em.getTransaction().begin();
    em.flush();
    //em.getTransaction().commit();
}

谢谢大家的时间! :)

3 个答案:

答案 0 :(得分:0)

您需要保留更改的实体/数据。设置新PW后entityManager.persist(employee);

以下是其他一些提示:

不应该进行演员表演。你可以修改为。

Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername", Employee.class);
query.setParameter("inUsername", username);
return query.getSingleResult(); // now EMPLOYEE

您的工作流程应该是:

  1. 输入userName
  2. 检查user是否存在(byName)
  3. 输入currentPasswordnewPasswordnewPasswordConfirm
  4. 更改值
  5. 坚持您的User/Employee,因此更改也将在DB中进行。如果不将其保存在DB中,您只需更改本地使用的Object-Instance。

答案 1 :(得分:0)

您不应该在doChangePassword()方法中更新密码,因为它位于客户端。它无法直接向数据库更新任何内容。它需要通过无状态会话bean来完成。

因此,您应该在无状态会话bean中修改方法以执行更新作业。

@Override
public void updatePasswordByUsername(String username, String password) throws UserNameNotFoundException
{
    Query query = em.createQuery("SELECT e FROM Employee e WHERE e.username = :inUsername");
    query.setParameter("inUsername", username);
    //query.getSingleResult();

    Employee employee = (Employee) query.getSingleResult();
    employee.setPassword(password);
    em.persist(employee);    
}

然后通过无状态会话bean在客户端调用此方法。

您可能需要在无状态会话bean中再次检查旧密码,以避免绕过客户端检查的攻击。<​​/ em>

答案 2 :(得分:-3)

你应该使用其中一个“保存,保存,更新,合并,saveOrUpdate”

尝试使用EntityManager.merge方法 - 这非常相似。

employee.setPassword(newPassword);   
em.merge(employee);