title: EJBException cannot cast one entity to another
body: <p>Has anyone encoutered this kind of problem while working with EJB and Tomee:</p>
  
  <blockquote>
    <p>SEVERE: Servlet.service() for servlet [rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController] in context with path [/Vezbe09] threw exception
    javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is:
         org.apache.openjpa.persistence.PersistenceException: rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.entity.Korisnik cannot be cast to 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)
        at com.sun.proxy.$Proxy89.sviJelovnici(Unknown Source)
        at rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doGet(LoginController.java:80)
        at rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doPost(LoginController.java:143)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at 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)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)</p>
  </blockquote>
  
  <p>Ok, so here is the <strong>LoginController</strong> servlet:</p>
  
  <pre><code>@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("")) &amp;&amp; (request.getParameter("kime") != null))
          {
              korisnickoIme = request.getParameter("kime");
          }
          if((!request.getParameter("kpass").equals("")) &amp;&amp; (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") &amp;&amp; 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);
  }
  </code></pre>
  
  <p>}</p>
  
  <p>And here are entitites <strong>Korisnik</strong> and <strong>Jelovnik</strong>:</p>
  
  <pre><code>@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&lt;Rezervacija&gt; rezervacije = new ArrayList&lt;Rezervacija&gt;();
  
  
  
  
  
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(name = "prijatelji",
          joinColumns =
              @JoinColumn(name = "prijatelj1", referencedColumnName = "korisnik_id"),
          inverseJoinColumns =
              @JoinColumn(name = "prijatelj2", referencedColumnName = "korisnik_id"))
  private List&lt;Korisnik&gt; prijateljiLista = new ArrayList&lt;Korisnik&gt;();
  
  
  @ManyToMany(mappedBy="pozvaniPrijatelji", fetch = FetchType.EAGER)
  private List&lt;Rezervacija&gt; rezervacijePrijatelji = new ArrayList&lt;Rezervacija&gt;();
  
  
  
  
  public List&lt;Rezervacija&gt; getRezervacijePrijatelji() {
      return rezervacijePrijatelji;
  }
  
  public void setRezervacijePrijatelji(List&lt;Rezervacija&gt; rezervacijePrijatelji) {
      this.rezervacijePrijatelji = rezervacijePrijatelji;
  }
  
  public Boolean getKorisnikPotvrda() {
      return korisnikPotvrda;
  }
  
  public void setKorisnikPotvrda(Boolean korisnikPotvrda) {
      this.korisnikPotvrda = korisnikPotvrda;
  }
  
  public List&lt;Rezervacija&gt; getRezervacije() {
      return rezervacije;
  }
  
  public void setRezervacije(List&lt;Rezervacija&gt; rezervacije) {
      this.rezervacije = rezervacije;
  }
  
  
  public Restoran getRestoran() {
      return restoran;
  }
  
  public void setRestoran(Restoran restoran) {
      this.restoran = restoran;
  }
  
  
  public List&lt;Korisnik&gt; getPrijateljiLista() {
      return prijateljiLista;
  }
  
  public void setPrijateljiLista(List&lt;Korisnik&gt; 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&lt;Restoran&gt; jelovnikRestorani = new ArrayList&lt;Restoran&gt;();
  
  
  @ManyToMany(fetch = FetchType.EAGER) 
  @JoinTable(name="Jelo_za_jelovnike", 
        joinColumns=@JoinColumn(name="jelovnik_id"),
        inverseJoinColumns=@JoinColumn(name="jelo_id"))
  private List&lt;Jelo&gt; razlicitaHrana = new ArrayList&lt;Jelo&gt;();
  
  
  
  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&lt;this.getRazlicitaHrana().size(); i++)
      {
          if(j.getId().equals(this.getRazlicitaHrana().get(i).getId()))
          {
              razlicitaHrana.remove(i);
              break;
          }
      }
  
      for(int b=0; b&lt;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&lt;Jelo&gt; getRazlicitaHrana() {
      return razlicitaHrana;
  }
  
  
  public void setRazlicitaHrana(List&lt;Jelo&gt; razlicitaHrana) {
      this.razlicitaHrana = razlicitaHrana;
  }
  
  
  public Integer getId() {
      return id;
  }
  
  
  public void setId(Integer id) {
      this.id = id;
  }
  </code></pre>
  
  <p>And here is a DAOBean who caused an exception:</p>
  
  <pre><code>@Stateless
  @Local(JelovnikDaoLocal.class)
  public class JelovnikDaoBean extends GenericDaoBean&lt;Jelovnik, Integer&gt; implements JelovnikDaoLocal
  {
  
  public Jelovnik findJelovnikRestorana(Integer idRestoran) 
  {
  
      return (Jelovnik) em.createNamedQuery("findJelovnikRestorana").setParameter("IDRestoran", idRestoran).getSingleResult(); 
  }
  
  public List&lt;Jelovnik&gt; sviJelovnici() 
  {
      return (List&lt;Jelovnik&gt;) em.createNamedQuery("sviJelovnici").getResultList();
  }
  
  public Jelovnik jelovnikSifra(Integer IDJelovnik) 
  {
      return (Jelovnik) em.createNamedQuery("jelovnikSifra").setParameter("IDJelovnik", IDJelovnik).getSingleResult();
  }
  
  }
  </code></pre>
  
  <p>This is MDB class:</p>
  
  <pre><code>@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 = "&lt;q&gt;localhost:8080/Vezbe09/PotvrdaRegistracijeController?sifraGost=" + gost.getId()+ "&lt;/q&gt;";
      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&lt;rez.getPozvaniPrijatelji().size(); i++)
      {
          String link = "&lt;q&gt;localhost:8080/Vezbe09/PotvrdaRezervacijeController?sifraGost=" + rez.getPozvaniPrijatelji().get(i).getId()+ "&amp;sifraRez="+rez.getId() +"&lt;/q&gt;";
          String poruka = "Vas prijatelj &lt;b&gt;" + rez.getGost().getKorisnikIme() + " " + rez.getGost().getKorisnikPrezime() + "&lt;/b&gt; vas je pozvao u restoran &lt;b&gt;" + rez.getRestoranRez().getNazivRestorana() + "&lt;/b&gt;. "
                  + "Datum rezervacije je: &lt;b&gt;" + rez.getDatumRezervacije().toString() + "&lt;/b&gt;, dok je Vas sto sa brojem &lt;b&gt;" + rez.getStoRez().getId() + "&lt;/b&gt;. &lt;br/&gt;"
                  + "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.");
      }
  
  }
  </code></pre>
  
  <p>}
  And this is how its called:</p>
  
  <pre><code>@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();
          }
      }
  </code></pre>
  
  <p>Funny thing is that i did the same test for a couple of times, and 3 out of 4 it works fine, but sometimes just snaps and throws an exception i showed you.
  And just to let you know, i dont cast any entity to another whatsoever, obviously not bean <strong>Korisnik</strong> to bean <strong>Jelovnik</strong>.
  And everything works fine, until i use MDB to send an email.
  Before that everything is OK.
  And it breaks on line when i try to get data from mysql database, using DAO.
  Any ideas guys... Tnx. :)</p>