我正在开发一个简单的注册系统,允许用户注册。我具有以下配置,实体和服务:

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”。

07-26 02:01