我正在开发一个简单的注册系统,允许用户注册。我具有以下配置,实体和服务:persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="pro-jpa" transaction-type="JTA">
<jta-data-source>jdbc/__testPerso</jta-data-source>
<class>com.jules.esiee.entities.Utilisateur</class>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
</persistence-unit>
</persistence>
豆
Utilisateur.java
package com.jules.esiee.entities;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.persistence.*;
import com.jules.esiee.dao.UtilisateurDao;
@ManagedBean
@RequestScoped
@Entity
@Table(name="utilisateur")
public class Utilisateur {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private long id;
@Column(name="nom")
private String nom;
@Column(name="prenom")
private String prenom;
@Column(name="age")
private int age;
@EJB
@Transient
private UtilisateurDao userDao;
public long getId()
{
return id;
}
public void setId(long _id)
{
id = _id;
}
public String getNom()
{
return nom;
}
public void setNom(String _nom)
{
nom = _nom;
}
public String getPrenom()
{
return prenom;
}
public void setPrenom(String _prenom)
{
prenom = _prenom;
}
public int getAge()
{
return age;
}
public void setAge(int _age)
{
age = _age;
}
public void sauvegarde() throws Exception
{
userDao.creer(this);
}
public void validationAge(FacesContext context, UIComponent component, Object convertedValue) throws ValidatorException {
this.age = (int) convertedValue;
if(!testAge())
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Vous êtes mineur",null));
}
}
public String validation()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if(!this.testAge())
{
facesContext.addMessage("f:age", new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erreur sur l'âge, vous êtes mineur, bande de bouffons", "test"));
return null;
}
else
{
if(!alreadyInDB())
{
//this.sauvegarde();
return "listeUser";
}
else
{
facesContext.addMessage("f:nom", new FacesMessage(FacesMessage.SEVERITY_ERROR,"Utilisateur déjà existant", "test"));
return null;
}
}
}
public boolean alreadyInDB()
{
if(userDao.trouver(this) == null)
{
return false;
}
else
{
return true;
}
}
public boolean testAge()
{
if(this.age < 18) return false;
return true;
}
}
DAO
UtilisateurDao.java
package com.jules.esiee.dao;
import java.io.Serializable;
import javax.persistence.*;
import javax.ejb.*;
import com.jules.esiee.entities.Utilisateur;
@Stateless
public class UtilisateurDao implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String JPQL_SELECT_ALREADY = "SELECT u.prenom,u.nom,u.age FROM Utilisateur u WHERE u.prenom=:prenom AND u.nom=:nom AND u.age=:age";
// Injection du manager, qui s'occupe de la connexion avec la BDD
@PersistenceContext( unitName = "pro-jpa" )
private EntityManager em;
// Enregistrement d'un nouvel utilisateur
public void creer( Utilisateur utilisateur ) throws Exception {
try {
em.persist( utilisateur );
} catch ( Exception e ) {
throw new Exception( e );
}
}
// Recherche d'un utilisateur à parter de son adresse email
public Utilisateur trouver( Utilisateur _utilisateur){
Utilisateur utilisateur = null;
Query requete = em.createQuery( JPQL_SELECT_ALREADY );
requete.setParameter( "prenom", _utilisateur.getPrenom());
requete.setParameter("nom", _utilisateur.getNom());
requete.setParameter("age", _utilisateur.getAge());
try {
utilisateur = (Utilisateur) requete.getSingleResult();
} catch ( NoResultException e ) {
return null;
}
return utilisateur;
}
}
有两个问题:
当我保留一个新用户时,它不会出现在数据库中。这里没有异常。
当我选择一个现有用户时,它将引发以下异常:
[Ljava.lang.Object;无法转换为com.jules.esiee.entities.Utilisateur
我不太了解
getSingleResult()
方法返回的内容。 最佳答案
首先,我建议将实体与托管Bean分开。实体不应该对DAO或托管Bean一无所知。其次,尝试使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)在DAO中注释方法“ sauvegarde”。