EJBException无法将一个实体强制转换为另一个实体

时间:2016-02-20 18:00:55

标签: java mysql ejb tomee

在使用EJB和Tomee时,有没有人遇到过这类问题:

  

SEVERE:Servlet [rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController]的Servlet.service()在路径[/ Vezbe09]的上下文中引发了异常   javax.ejb.EJBException:bean遇到了非应用程序异常;嵌套异常是:        org.apache.openjpa.persistence.PersistenceException:rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.entity.Korisnik无法强制转换为rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01 .server.entity.Jelovnik   FailedObject:SELECT je FROM Jelovnik je [java.lang.String]       at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:363)       at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283)       在com.sun.proxy。$ Proxy89.sviJelovnici(未知来源)       在rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doGet(LoginController.java:80)       在rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doPost(LoginController.java:143)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:641)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:722)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)       在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)       在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)       在org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)       在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)       在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)       在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)       在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)       在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)       at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:585)       at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)       在java.lang.Thread.run(Thread.java:745)

好的,这是 LoginController servlet:

@WebServlet("/LoginController")
public class LoginController extends HttpServlet {
private static final long serialVersionUID = 1L;

@EJB
private KorisnikDaoLocal korisnikDao;

@EJB
private JeloDaoLocal jeloDao;

@EJB
private JelovnikDaoLocal jelovnikDao;

@EJB
private RestoranDaoLocal restoranDao;

@EJB
private RezervacijaDaoLocal rezervacijaDao;

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub

    try {


        String korisnickoIme = null;
        String lozinka = null;

        if((!request.getParameter("kime").equals("")) && (request.getParameter("kime") != null))
        {
            korisnickoIme = request.getParameter("kime");
        }
        if((!request.getParameter("kpass").equals("")) && (request.getParameter("kpass") != null))
        {
            lozinka = request.getParameter("kpass");
        }


        if ((korisnickoIme == null) || (korisnickoIme.equals("")) || (lozinka == null) || (lozinka.equals(""))) {
            response.sendRedirect(response.encodeRedirectURL("loginGreska.jsp"));
            return;
        }

        Korisnik korisnik = korisnikDao.findKorisnikSaKorisnickimImenomILozinkom(korisnickoIme, lozinka);

        if (korisnik != null) 
        {   
            if(korisnik.getKorisnikVrsta().equals("a"))
            {
                HttpSession session = request.getSession(true);
                session.setAttribute("admin", korisnik);
                session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
                session.setAttribute("sviMenadzeri", korisnikDao.sviMenadzeri("m"));
                session.setAttribute("restorani", restoranDao.sviRestorani());
                session.setAttribute("sviJelovnici", jelovnikDao.sviJelovnici());
                request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);
            }
            else if(korisnik.getKorisnikVrsta().equals("m"))
            {
                HttpSession session = request.getSession(true);
                session.setAttribute("menadzer", korisnik);
                session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
                session.setAttribute("jelo", jeloDao.findJelovnik(korisnik.getRestoran().getId()));
                session.setAttribute("jelovniciRestorana", jelovnikDao.findJelovnikRestorana(korisnik.getRestoran().getId()));
                request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);
            }
            else if(korisnik.getKorisnikVrsta().equals("g") && korisnik.getKorisnikPotvrda())
            {
                HttpSession session = request.getSession(true);             
                session.setAttribute("gost", korisnik);
                session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
                session.setAttribute("restorani", restoranDao.sviRestorani());
                session.setAttribute("gostRezervacije", rezervacijaDao.findRezervacije(korisnik.getId()));
                session.setAttribute("sveReze", rezervacijaDao.findAll());

                session.setAttribute("gostVazeceRez", korisnik.vazeceRez(rezervacijaDao.findRezervacije(korisnik.getId())));    
                session.setAttribute("gostNeVazeceRez", korisnik.neVazeceRez(rezervacijaDao.findRezervacije(korisnik.getId())));


                request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);

            }
            else
            {
                response.sendRedirect("loginGreska.jsp");
                return;
            }
        }
        else
        {
            response.sendRedirect("loginGreska.jsp");
            return;
        }

    } catch (EJBException e) {
        if (e.getCause().getClass().equals(NoResultException.class)) {
            response.sendRedirect(response.encodeRedirectURL("loginGreska.jsp"));
        } else {
            e.printStackTrace();
            throw e;
        }
    } catch (ServletException e) {
        throw e;
    } catch (IOException e) {
        throw e;
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

}

以下是 Korisnik Jelovnik 的权利:

@Entity
@Table(name = "korisnik")
public class Korisnik implements Serializable {

private static final long serialVersionUID = 3770759786667844735L;

@Id
@GeneratedValue(strategy = IDENTITY) // ovde je onaj AUTO_INCREMENT
@Column(name = "korisnik_id", unique = true, nullable = false)
private Integer id;

@Column(name = "korisnik_korisnicko_ime", unique = true, nullable = false)
private String korisnickoImeKorisnika;

@Column(name = "korisnik_lozinka", unique = false, nullable = false)
private String lozinkaKorisnika;

@Column(name = "korisnik_vrsta", unique = false, nullable = false)
private String korisnikVrsta;

@Column(name = "korisnik_ime", unique = false, nullable = false)
private String korisnikIme;

@Column(name = "korisnik_prezime", unique = false, nullable = false)
private String korisnikPrezime;

@Column(name = "korisnik_slika", unique = false, nullable = true)
private String korisnikSlika;

@Column(name = "korisnik_potvrda", unique = false, nullable = true)
private Boolean korisnikPotvrda;

@ManyToOne
@JoinColumn(name = "restoran_id", referencedColumnName = "restoran_id", nullable = true)
private Restoran restoran;


@OneToMany(cascade = { ALL }, fetch = FetchType.EAGER, mappedBy = "gost")
private List<Rezervacija> rezervacije = new ArrayList<Rezervacija>();





@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "prijatelji",
        joinColumns =
            @JoinColumn(name = "prijatelj1", referencedColumnName = "korisnik_id"),
        inverseJoinColumns =
            @JoinColumn(name = "prijatelj2", referencedColumnName = "korisnik_id"))
private List<Korisnik> prijateljiLista = new ArrayList<Korisnik>();


@ManyToMany(mappedBy="pozvaniPrijatelji", fetch = FetchType.EAGER)
private List<Rezervacija> rezervacijePrijatelji = new ArrayList<Rezervacija>();




public List<Rezervacija> getRezervacijePrijatelji() {
    return rezervacijePrijatelji;
}

public void setRezervacijePrijatelji(List<Rezervacija> rezervacijePrijatelji) {
    this.rezervacijePrijatelji = rezervacijePrijatelji;
}

public Boolean getKorisnikPotvrda() {
    return korisnikPotvrda;
}

public void setKorisnikPotvrda(Boolean korisnikPotvrda) {
    this.korisnikPotvrda = korisnikPotvrda;
}

public List<Rezervacija> getRezervacije() {
    return rezervacije;
}

public void setRezervacije(List<Rezervacija> rezervacije) {
    this.rezervacije = rezervacije;
}


public Restoran getRestoran() {
    return restoran;
}

public void setRestoran(Restoran restoran) {
    this.restoran = restoran;
}


public List<Korisnik> getPrijateljiLista() {
    return prijateljiLista;
}

public void setPrijateljiLista(List<Korisnik> prijateljiLista) {
    this.prijateljiLista = prijateljiLista;
}

public String getKorisnikSlika() {
    return korisnikSlika;
}

public void setKorisnikSlika(String korisnikSlika) {
    this.korisnikSlika = korisnikSlika;
}

public String getKorisnikIme() {
    return korisnikIme;
}

public void setKorisnikIme(String korisnikIme) {
    this.korisnikIme = korisnikIme;
}

public String getKorisnikPrezime() {
    return korisnikPrezime;
}

public void setKorisnikPrezime(String korisnikPrezime) {
    this.korisnikPrezime = korisnikPrezime;
}

public String getKorisnikVrsta() {
    return korisnikVrsta;
}

public void setKorisnikVrsta(String korisnikVrsta) {
    this.korisnikVrsta = korisnikVrsta;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getKorisnickoImeKorisnika() {
    return korisnickoImeKorisnika;
}

public void setKorisnickoImeKorisnika(String korisnickoImeKorisnika) {
    this.korisnickoImeKorisnika = korisnickoImeKorisnika;
}

public String getLozinkaKorisnika() {
    return lozinkaKorisnika;
}

public void setLozinkaKorisnika(String lozinkaKorisnika) {
    this.lozinkaKorisnika = lozinkaKorisnika;
}

public Korisnik() {
    super();
}

public Korisnik(String korisnickoImeKorisnika,
        String lozinkaKorisnika, String korisnikVrsta, String korisnikIme,
        String korisnikPrezime, String korisnikSlika, Boolean korisnikPotvrda) {
    super();
    this.korisnickoImeKorisnika = korisnickoImeKorisnika;
    this.lozinkaKorisnika = lozinkaKorisnika;
    this.korisnikVrsta = korisnikVrsta;
    this.korisnikIme = korisnikIme;
    this.korisnikPrezime = korisnikPrezime;
    this.korisnikSlika = korisnikSlika;
    this.korisnikPotvrda = korisnikPotvrda;
}


@Entity
@Table(name = "jelovnik")
@NamedQueries({
@NamedQuery(name = "findJelovnikRestorana", query = "SELECT je FROM    Jelovnik je JOIN je.jelovnikRestorani jer WHERE jer.id= :IDRestoran"),
@NamedQuery(name = "sviJelovnici", query = "SELECT je FROM Jelovnik je"), 

public class Jelovnik implements Serializable
{
@Id
@Column(name = "jelovnik_id", unique = true, nullable = false)
private Integer id;

@OneToMany(cascade = { ALL }, fetch = FetchType.EAGER, mappedBy = "jelovnik")
private List<Restoran> jelovnikRestorani = new ArrayList<Restoran>();


@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name="Jelo_za_jelovnike", 
      joinColumns=@JoinColumn(name="jelovnik_id"),
      inverseJoinColumns=@JoinColumn(name="jelo_id"))
private List<Jelo> razlicitaHrana = new ArrayList<Jelo>();



public Jelovnik(Integer id) {
    super();
    this.id = id;
}

public Jelovnik()
{
    super();
}

public void addJelo(Jelo j)
{
    if(razlicitaHrana.contains(j))
    {
        return;
    }
    razlicitaHrana.add(j);
}

public void removeJelo(Jelo j)
{
    for(int i=0; i<this.getRazlicitaHrana().size(); i++)
    {
        if(j.getId().equals(this.getRazlicitaHrana().get(i).getId()))
        {
            razlicitaHrana.remove(i);
            break;
        }
    }

    for(int b=0; b<j.getHranaJelovnici().size(); b++)
    {
        if(j.getHranaJelovnici().get(b).getId().equals(this.getId()))
        {
            j.getHranaJelovnici().remove(b);
            break;
        }
    }

}

public void addRestoran(Restoran res)
{
    if(jelovnikRestorani.contains(res))
    {
        return;
    }
    jelovnikRestorani.add(res);
}

public void removeRestoran(Restoran res)
{
    jelovnikRestorani.remove(res);
}


public List<Jelo> getRazlicitaHrana() {
    return razlicitaHrana;
}


public void setRazlicitaHrana(List<Jelo> razlicitaHrana) {
    this.razlicitaHrana = razlicitaHrana;
}


public Integer getId() {
    return id;
}


public void setId(Integer id) {
    this.id = id;
}

这是导致异常的DAOBean:

@Stateless
@Local(JelovnikDaoLocal.class)
public class JelovnikDaoBean extends GenericDaoBean<Jelovnik, Integer> implements JelovnikDaoLocal
{

public Jelovnik findJelovnikRestorana(Integer idRestoran) 
{

    return (Jelovnik) em.createNamedQuery("findJelovnikRestorana").setParameter("IDRestoran", idRestoran).getSingleResult(); 
}

public List<Jelovnik> sviJelovnici() 
{
    return (List<Jelovnik>) em.createNamedQuery("sviJelovnici").getResultList();
}

public Jelovnik jelovnikSifra(Integer IDJelovnik) 
{
    return (Jelovnik) em.createNamedQuery("jelovnikSifra").setParameter("IDJelovnik", IDJelovnik).getSingleResult();
}

}

这是MDB类:

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "PaymentQueue") 
    }
)
 public class KorisnikBean implements MessageListener
{
@Resource(name="Mail")
Session session;

public KorisnikBean()
{

}


public void onMessage(Message arg0) 
{
    try {
        if (arg0 instanceof ObjectMessage) 
        {
            ObjectMessage obj = (ObjectMessage) arg0;
            if(obj.getObject() instanceof Korisnik)
            {
                Korisnik gost = (Korisnik)obj.getObject();                         
                sendMessage(gost);
            }
            else if(obj.getObject() instanceof Rezervacija)
            {
                Rezervacija rez = (Rezervacija)obj.getObject();
                sendMessage2(rez);
            }
        } 
        else {
            System.out.println("MESSAGE BEAN: Message of wrong type: " + arg0.getClass().getName());
        }
    } catch (JMSException e) {
        e.printStackTrace();
    } catch (Throwable te) {
        te.printStackTrace();
    }

}

public void sendMessage(Korisnik gost) throws AddressException, MessagingException
{
    String link = "<q>localhost:8080/Vezbe09/PotvrdaRegistracijeController?sifraGost=" + gost.getId()+ "</q>";
    String poruka = "Jos samo jedan korak vas deli do uspesne registracije."
            + "Kliknite na sledeci link da potvrdite registraciju:"
            +  link;
    javax.mail.Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress("petaro738@gmail.com"));
    msg.setRecipients(RecipientType.TO, InternetAddress.parse(gost.getKorisnickoImeKorisnika()));
    msg.setSubject("Registracija");
    msg.setContent(poruka, "text/html; charset=utf-8");

    msg.setSentDate(new Date());

    // Sends the message
    Transport.send(msg);

    System.out.println("MESSAGE BEAN: Mail was sent successfully.");
}

public void sendMessage2(Rezervacija rez) throws AddressException, MessagingException
{

    for(int i=0; i<rez.getPozvaniPrijatelji().size(); i++)
    {
        String link = "<q>localhost:8080/Vezbe09/PotvrdaRezervacijeController?sifraGost=" + rez.getPozvaniPrijatelji().get(i).getId()+ "&sifraRez="+rez.getId() +"</q>";
        String poruka = "Vas prijatelj <b>" + rez.getGost().getKorisnikIme() + " " + rez.getGost().getKorisnikPrezime() + "</b> vas je pozvao u restoran <b>" + rez.getRestoranRez().getNazivRestorana() + "</b>. "
                + "Datum rezervacije je: <b>" + rez.getDatumRezervacije().toString() + "</b>, dok je Vas sto sa brojem <b>" + rez.getStoRez().getId() + "</b>. <br/>"
                + "Kliknite na sledeci link da potvrdite rezervaciju:"
                +  link;
        javax.mail.Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("petaro738@gmail.com"));
        msg.setRecipients(RecipientType.TO, InternetAddress.parse(rez.getPozvaniPrijatelji().get(i).getKorisnickoImeKorisnika()));
        msg.setSubject("Pozivnica u restoran " + rez.getRestoranRez().getNazivRestorana());
        msg.setContent(poruka, "text/html; charset=utf-8");

        msg.setSentDate(new Date());

        // Sends the message
        Transport.send(msg);

        System.out.println("MESSAGE BEAN: Mail was sent successfully.");
    }

}

} 这就是它所谓的:

@Resource(name="JmsConnectionFactory")
private ConnectionFactory qcf;

@Resource(name="PaymentQueue")
private Queue paymentQueue;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        try {
            // Creates a connection
            connection = qcf.createConnection();

            // Creates a session
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // Creates a message producer from the Session to the Topic or Queue
            producer = session.createProducer(paymentQueue);

            // Creates an object message
            ObjectMessage object = session.createObjectMessage();
            object.setObject(rezervacija);
            // Tells the producer to send the object message
            producer.send(object);

            // Closes the producer
            producer.close();

            // Closes the session
            session.close();

            // Closes the connection
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

有趣的是,我做了几次相同的测试,4次中有3次可以正常工作,但有时只是拍摄并抛出异常我告诉你。 而且只是为了让你知道,我不会将任何实体投射到另一个实体上,显然不是bean Korisnik 到bean Jelovnik 。 一切正常,直到我使用MDB发送电子邮件。 在此之前一切都还好。 当我尝试使用DAO从mysql数据库获取数据时,它就会中断。 任何想法的人... Tnx。 :)

0 个答案:

没有答案
相关问题