Witam. Piszę stronę, która ma mi umożliwić zalogowanie użytkownika.
W bazie danych mam tabelę admins:
CREATE TABLE IF NOT EXISTS `ePrzychodnia`.`admins` (
`id` INT NOT NULL ,
`firstName` VARCHAR(45) NOT NULL ,
`lastName` VARCHAR(45) NOT NULL ,
`personalId` VARCHAR(11) NOT NULL ,
`password` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `personalId_UNIQUE` (`personalId` ASC) ,
UNIQUE INDEX `password_UNIQUE` (`password` ASC) )
Klasę Admin, która mapuje tą tabelę.
@Entity
@Table(name = "admins")
@XmlRootElement
public class Admin implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "firstName")
private String firstName;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "lastName")
private String lastName;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 11)
@Column(name = "personalId")
private String personalId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "password")
private String password;
dalej jakieś gettery i settery
ManagedBean JSF:
@ManagedBean
@RequestScoped
public class LoginMB {
private static final String PERSISTENCE_UNIT_NAME = "ePrzychodnia-ejbPU";
private static EntityManagerFactory factory;
private String login;
private String password;
/**
* Creates a new instance of LoginMB
*/
public LoginMB() {
}
Gettery i settery
public String validate() {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
q.setParameter("login", login);
q.setParameter("password", password);
try {
Admin admin = (Admin) q.getSingleResult();
if (login.equals(admin.getPersonalId()) && password.equals(admin.getPersonalId())) {
return "success";
}
} catch (Exception e) {
System.out.println("Błąd: " + e.getMessage());
return null;
}
return "failed";
}
}
Strona logująca:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Logowanie</title>
</h:head>
<h:body>
<h1>Logowanie</h1>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel value="Login"></h:outputLabel>
<h:inputText id="login" value="#{loginMB.login}" label="Login">
<f:validateRequired/>
</h:inputText>
<h:message for="login" style="color:red" />
<h:outputLabel value="Password"></h:outputLabel>
<h:inputSecret id="pass" value="#{loginMB.password}" label="Password">
<f:validateRequired/>
</h:inputSecret>
<h:message for="pass" style="color:red" />
<h:commandButton value="Logowanie" action="#{loginMB.validate()}"></h:commandButton>
</h:panelGrid>
</h:form>
</h:body>
</html>
Do tabeli w bazie danych dodałem następujący wpis:
insert into admins values(1, 'admin', 'admin', '12345678901', 'admin');
Problem jest następujący. Na stronie mam ekran logowania wpisuję dane do logowania i niestety nic się nie dzieje, jest łapany wyjątek, bo funkcja validate zwraca null. W catch w tej metodzie dodałem System.out.println("Błąd: " + e.getMessage()); by sprawdzić co jest przyczyną. I dostaję coś takiego:
INFO: Błąd: getSingleResult() did not retrieve any entities.
Wnioskuję więc, że problem jest tutaj:
public String validate() {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
q.setParameter("login", login);
q.setParameter("password", password);
try {
Admin admin = (Admin) q.getSingleResult();
if (login.equals(admin.getPersonalId()) && password.equals(admin.getPersonalId())) {
return "success";
}
} catch (Exception e) {
System.out.println("Błąd: " + e.getMessage());
return null;
}
return "failed";
}
w tej funkcji a dokładniej zapytanie nic nie zwraca mimo tego iż wpisuję poprawne dane konta wrzuconego do tabeli.
Czyżby zapytanie
Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
nic nie zwróciło? Wyjątek prawdopodobnie występuje w tym miejscu: Admin admin = (Admin) q.getSingleResult();
bo dostaję coś takiego jak wyżej napisałem:
> INFO: Błąd: getSingleResult() did not retrieve any entities.
Co zrobiłem źle? Bo ja już nie mam pojęcia proszę o pomoc, jeśli ktoś ma czas i chęci spojrzeć na powyższy kod.