私の質問は、システムにログインしているユーザーのパスワードを変更することです。新しいパスワードが正常に変更されたことが表示されますが、確認するとパスワードは変更されていません。私はset.Passwordを使うからですか?他の方法はありますか?このコードは、usernameを使用してEmployeeを取得しようとします。データベースのユーザーのパスワードを変更する
UPDATED:この質問は、Alexの華麗な答えと他の提案とで解決されました。皆さん、ありがとうございました。
これは、リモートコントローラ別のプログラム、employeeController呼ばれるステートレス・セッションBeanで
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");
}
}
を起動する方法です。このメソッドは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();
}
ありがとうございます! :)
まず、新しいパスワードを入力する前に、現在のパスワードが正しいかどうかを確認してください。 – LenglBoy
パスワードを設定した後、データベースを更新する前に 'flush'する必要があります。 – Alex
は、オブジェクトのフィールドを更新するときにオブジェクトが存在するオブジェクトライフサイクルの状態(管理、分離、一時的な)を教えてください。データベース内の変更を取得するために必要な作業が決定されるためです。 JPA仕様に従って... – DN1