【发布时间】:2017-10-23 07:33:46
【问题描述】:
我的问题是更改登录系统的用户的密码。它打印出新密码已成功更改,但是当我检查它时,密码保持不变并且没有更改。是因为我使用 set.Password 吗?还有其他方法吗?此代码尝试使用用户名检索员工。
已更新:Alex 的精彩回答以及其他建议已解决了这个问题!谢谢你们。
这是调用遥控器的方法
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
}
这是我创建的新方法。我尝试使用提交,但没有奏效。我也尝试使用持久化和刷新。但它说它是重复的,并且存在非法争论错误。冲洗效果不佳,错误代码提到没有什么可以冲洗的。 我创建了这个新方法并没有将它放在retrievePasswordByUsername 方法下,因为我认为它不应该存在,因为它只是检索它?所以我在下面创建了一个新方法。但它仍然不起作用。
@Override
public void updateNewPassword(Employee employee) {
//em.getTransaction().begin();
em.flush();
//em.getTransaction().commit();
}
感谢大家的宝贵时间! :)
【问题讨论】:
-
在输入新用户之前,首先应检查用户是否存在且当前密码是否正确。
-
设置密码后需要
flush更新数据库。 -
请告诉我们,当您更新其上的字段时,该对象处于什么对象生命周期状态(托管、分离、瞬态?)?因为这决定了您需要做什么来获取数据库中的更改。根据 JPA 规范 ...
-
您可以将传递到客户端并返回到服务器端的
employee分离。因此,如果您再次尝试persist它,它会说它是重复的,因为 JPA 将尝试“插入”而不是“更新”
标签: java jpa stateless-session-bean