Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Object: [some.class@af683a] is not a known entity type

I've tried that, to no avail. Then I've re-mapped the database using orm.xml, and it worked, and now it is working.

W.

2011/6/3 Tom Ware <tom.ware@xxxxxxxxxx>
It looks like, as James suggested, there is something going on with the classloaders.

Is there a chance that the fact that that helper is created in a static is affecting the classloader it is using?  What happens if you move the call to Persistence.createEntityManagerFactory("AMB-JPA") into a non-static part of yoru application.


-Tom

Wellington L.S. da Silva wrote:
Sure,

The EntityManagerFactoryHelper class is as follows:

public class EntityManagerFactoryHelper {

   private static EntityManagerFactory factory;

   static {
       try {
           factory = Persistence.createEntityManagerFactory("AMB-JPA");
       } catch(ExceptionInInitializerError e) {
           throw e;
       }
   }

   public static EntityManagerFactory getFactory() {
       return factory;
   }

}

it's a simple singleton based on code sugested at Slashdot on the topic.

The code leading to the merge is this:

   public String votarEnqueteAtiva() throws Exception {
       System.out.println("inicio da votarEnqueteAtiva");
       List<Enquete> le = CRUDAdm.listByProperty(
Enquete.class, "ativa", new Integer(1));  <<<<<<<<<<<<<< Query executed here
       if (le.size() == 1) {
           Enquete e = le.get(0);
           List<EnqueteResposta> resps = e.getEnqueteRespostas();
           Iterator<EnqueteResposta> i = resps.iterator();
           while (i.hasNext()) {
               EnqueteResposta er = i.next();
               if (er.getId() == voto) er.setTotal(er.getTotal() + 1);  <<<<<<<< change in slave object
           }
           CRUDAdm.update(le);   <<<<<<<<<<<<<<<<<<<<<<<<< update (merge) called here
           eab = new EnqueteAtivaBean();
           eab.setPergunta(e.getQuestao());
           List<String> re = new LinkedList<String>();
           List<String> pe = new LinkedList<String>();
           i = resps.iterator();
           int totalGeral = 0;
           while (i.hasNext()) {
               EnqueteResposta er = i.next();
               re.add(er.getResposta());
               totalGeral += er.getTotal();                            }
           eab.setRespostas(re);
           i = resps.iterator();
           while (i.hasNext()) {
               EnqueteResposta er = i.next();
               pe.add(""+er.getTotal()*100/totalGeral);
           }
           eab.setPercents(pe);
           HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
           HttpSession session = request.getSession();
           session.setAttribute("enqueteAtiva",eab);
       }
       System.out.println("fim da votarEnqueteAtiva");
       return NONE;
   }


Thanks in advance,

Wellington


2011/6/2 Tom Ware <tom.ware@xxxxxxxxxx <mailto:tom.ware@xxxxxxxxxx>>


   Can you provide the code leading up to and including the merge() and
   the code that creates for EntityManagerFactoryHelper.getFactory().

   -Tom


   Wellington L.S. da Silva wrote:

       Hi Tom, here it is, generated by Dali with parameters added by me:

       <?xml version="1.0" encoding="UTF-8"?>
       <persistence version="2.0"
       xmlns="http://java.sun.com/xml/ns/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="AMB_JPA"
       transaction-type="RESOURCE_LOCAL">
                     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
              <class>com.amb.entidades.Enquete</class>
              <class>com.amb.entidades.EnqueteResposta</class>
              <properties>
                  <property name="eclipselink.target-database"
       value="MySQL"/>
                  <property name="javax.persistence.jdbc.url"
       value="jdbc:mysql://localhost:3306/amb"/>
                  <property name="javax.persistence.jdbc.user"
       value="root"/>
                  <property name="javax.persistence.jdbc.password"
       value="mobview"/>
                  <property name="javax.persistence.jdbc.driver"
       value="com.mysql.jdbc.Driver"/>
              </properties>
          </persistence-unit>
       </persistence>

       It is located at the jar under the META-INF folder. The jar
       folder structure is:

       root
       META-INF (which contains the file persistence.xml)
       com (root of the classpath to the classes)

       I must remark that BEFORE I try to update the objects I perform
       a query via the listByProperty method (highlighted below) which
       works, so retrieving the very proper object. When I try to
       update that retrieved object, it blunders.

       The listByProperty is:

              public static <T> List<T> listByProperty(Class<T>
       entityClass, String propertyName, Object propertyValue) throws
       Exception {             EntityManager em = getEntityManager();                    List<T> retorno = null;             try {                        String query = "select o from " +
       entityClass.getSimpleName() + "  o  where o." + propertyName + "
        = :propertyValue ";                 Query q =
       em.createQuery(query).setParameter("propertyValue",
       propertyValue);                      retorno =
       q.getResultList();             } catch (Exception ex) {                        ex.printStackTrace();             }             em.close();
                  return retorno;         }
       Cheers,

       Wellington

       2011/6/1 Tom Ware <tom.ware@xxxxxxxxxx
       <mailto:tom.ware@xxxxxxxxxx> <mailto:tom.ware@xxxxxxxxxx

       <mailto:tom.ware@xxxxxxxxxx>>>


          What does your persistence.xml look like?  Where is it packaged
          relative to your Enquete class? How is Enquete mapped?


          Wellington L.S. da Silva wrote:

              Hi all,

              My name is Wellington, I'm brazilian and I'm creating a poll
              application in pure JPA with Eclipselink, that has at the
       moment
              2 entities in a quite trivial One-to-many relationship:
       Enquete
              holds the one question, EnqueteResposta holds one of the many
              possible answers. Here's the scenario:

              1. I've setup a pure JPA project with Entities and Helper
              classes. The entities are created from pre-existant
       tables in a
              MySQL database by Eclipse Dali I wrote no code but a
       Cascade.ALL
              in the master class.

              2. The main Helper class is a CRUDAdmin that takes whatever
              class through Java Generics and applies JPA operations on
       them
              coded as follows:

              package com.amb.ops;

              import java.util.List;

              import javax.persistence.EntityManager;
              import javax.persistence.EntityTransaction;
              import javax.persistence.Query;

              @SuppressWarnings("unchecked")
              public class CRUDAdm {

                     private static EntityManager getEntityManager() {
                         EntityManager em =
                      EntityManagerFactoryHelper.getFactory().createEntityManager();
                         return em;
                     }              public static <T> T create(T entity)
              throws Exception {             EntityManager em =
              getEntityManager();             Exception e = null;                           T retornoEntity = null;                         EntityTransaction t =
              em.getTransaction();             try {                               t.begin();                 retornoEntity =
       em.merge(entity);                        t.commit();                    } catch (Exception ex) {                        if
       (t.isActive()) {                                   em.getTransaction().rollback();                 }                               e = ex;             }             em.close();
                         if (e != null) {                 throw e;                           }             return retornoEntity;         }                            public static <T> T update(T entity) throws
       Exception {                    EntityManager em =
       getEntityManager();             Exception
              e = null;             T retornoEntity = null;                           EntityTransaction t = em.getTransaction();                    try {                        t.begin();                        retornoEntity =
              em.merge(entity);                 t.commit();             }
              catch (Exception ex) {                 if (t.isActive())
       {                            t.rollback();                 }                        e
              = ex;             }             em.close();
                         if (e != null) {                 throw e;                           }             return retornoEntity;         }                            public static <T> void delete(T entity) throws
       Exception {                    EntityManager em =
       getEntityManager();                    Exception e = null;                    EntityTransaction t =
              em.getTransaction();             try {                               t.begin();                 entity = em.merge(entity);                               em.remove(entity);                 t.commit();
                          } catch (Exception ex) {                 if
       (t.isActive()) {                            t.rollback();                        }                        e = ex;             }                    em.close();
                         if (e != null) {                 throw e;                           }         }              public static <T> T
       retrieve(Class<T>
              entityClass, Object id) throws Exception {                           EntityManager em = getEntityManager();                    Exception e =
              null;             T retorno = null;                           EntityTransaction t = em.getTransaction();             try {                               t.begin();                 retorno =
              em.find(entityClass, id);                 t.commit();                           } catch (Exception ex) {                 if
       (t.isActive()) {                            t.rollback();                        }                        e = ex;             }                    em.close();
                         if (e != null) {                 throw e;                           }             return retorno;         }                     public
              static <T> List<T> listAll(Class<T> entityClass, String...
              orderbys) throws Exception {             EntityManager em =
              getEntityManager();             List<T> retorno = null;                           try {                 String query = "select o
       from " +
              entityClass.getSimpleName() + "  o  order by ";                                    for (String order : orderbys) {                            query
              += order + " , ";                 }                 query =
              query.substring(0, query.length() - 2);                        Query q
              = em.createQuery(query);                 retorno =
              q.getResultList();             } catch (Exception ex) {                               ex.printStackTrace();             }                    em.close();
                         return retorno;         }              public
       static
              <T> List<T> listAll(Class<T> entityClass) throws
       Exception {                    EntityManager em =
       getEntityManager();                    List<T> retorno = null;                    try {                                   String query =
       "select o from " +
              entityClass.getSimpleName() + "  o ";                        Query q =
              em.createQuery(query);                             retorno =
              q.getResultList();             } catch (Exception ex) {                               ex.printStackTrace();             }                    em.close();
                         return retorno;         }              public
       static
              <T> List<T> listByProperty(Class<T> entityClass, String
              propertyName, Object propertyValue) throws Exception {                           EntityManager em = getEntityManager();                    List<T>
              retorno = null;             try {                 String
       query =
              "select o from " + entityClass.getSimpleName() + "  o
        where o."
              + propertyName + "  = :propertyValue ";                        Query q
              = em.createQuery(query).setParameter("propertyValue",
              propertyValue);                      retorno =
              q.getResultList();             } catch (Exception ex) {                               ex.printStackTrace();             }                    em.close();
                         return retorno;         }                                                                                                                        public static <T> List<T>
       listByProperty(Class<T> entityClass,
              String propertyName, Object propertyValue, String operador,
              String... orderbys) throws Exception {                    EntityManager
              em = getEntityManager();             List<T> retorno =
       null;                    try {                 String query =
       null;                        if
       (!operador.equalsIgnoreCase("like")) {                                   query = "select o from " + entityClass.getSimpleName() + "  o
               where o." + propertyName + "  " + operador + "
       :propertyValue
              ";                 } else {                     query =
       "select
              o from " + entityClass.getSimpleName() + "  o  where
       upper(o." +
              propertyName + ")  " + operador + " upper(:propertyValue)
       ";                        }                      if (orderbys !=
       null &&
              orderbys.length > 0) {                     query+= "
       order by ";
                                  for (String order : orderbys) {                                       query += "o." + order + " , ";                            }
                                  query = query.substring(0,
       query.length() -
              2);                 }                      Query q =
              em.createQuery(query).setParameter("propertyValue",
              propertyValue);                      retorno =
              q.getResultList();             } catch (Exception ex) {                               ex.printStackTrace();             }                    em.close();
                         return retorno;         }              public
       static
              <T> List<T> listByProperty(Class<T> entityClass, String
              propertyName, Object propertyValue, String operador) throws
              Exception {             EntityManager em =
       getEntityManager();                    List<T> retorno = null;                    try {                        String query = "select o
       from " +
              entityClass.getSimpleName() + "  o  where o." +
       propertyName + "
               " + operador + " :propertyValue ";                 Query q =
              em.createQuery(query).setParameter("propertyValue",
              propertyValue);                  retorno =
       q.getResultList();                    } catch (Exception ex) {                               ex.printStackTrace();             }                    em.close();
                         return retorno;         }   }

              3. The EntityManagerHelper class is a singleton coded as
              suggested in the EclipseLink docs somewhere, so, it's a
              singleton to the factory class.

              4. Having that I packaged the classes in a jar file and
       used the
              jar file (now containing the full MODEL of the
       application with
              all db operations fully encapsulated) in the client Struts 2
              app. The idea is to create the MODEL classes
       incrementally and
              adding actions as new MODEL jars arrive.

              5. The struts app calls an action to update a value in
       the slave
              class EnqueteResposta, inside master class Enquete, as
       follows:

                 public String votarEnqueteAtiva() throws Exception {
                     System.out.println("inicio da votarEnqueteAtiva");
                     List<Enquete> le =
       CRUDAdm.listByProperty(Enquete.class,
              "ativa", new Integer(1));
                     if (le.size() == 1) {
                         Enquete e = le.get(0);
                         List<EnqueteResposta> resps =
       e.getEnqueteRespostas();
                         Iterator<EnqueteResposta> i = resps.iterator();
                         while (i.hasNext()) {
                             EnqueteResposta er = i.next();
                             if (er.getId() == voto)
       er.setTotal(er.getTotal()
              + 1);
                         }
                         CRUDAdm.update(le);
                         eab = new EnqueteAtivaBean();
                         eab.setPergunta(e.getQuestao());
                         List<String> re = new LinkedList<String>();
                         List<String> pe = new LinkedList<String>();
                         i = resps.iterator();
                         int totalGeral = 0;
                         while (i.hasNext()) {
                             EnqueteResposta er = i.next();
                             re.add(er.getResposta());
                             totalGeral += er.getTotal();                                          }
                         eab.setRespostas(re);
                         i = resps.iterator();
                         while (i.hasNext()) {
                             EnqueteResposta er = i.next();
                             pe.add(""+er.getTotal()*100/totalGeral);
                         }
                         eab.setPercents(pe);
                         HttpServletRequest request =
                     (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
                         HttpSession session = request.getSession();
                         session.setAttribute("enqueteAtiva",eab);
                     }
                     System.out.println("fim da votarEnqueteAtiva");
                     return NONE;
                 }
               Then I get the StackTrace below:

              *java.lang.IllegalArgumentException: Object:
              [com.amb.entidades.Enquete@af683a] is not a known entity
       type.*

                               org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3456)
                               org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:363)
                               org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3427)
                               org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:452)
                               org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:429)
                 com.amb.ops.CRUDAdm.update(CRUDAdm.java:46)
                               com.hoog.acoes.EnqueteAtiva.votarEnqueteAtiva(EnqueteAtiva.java:59)
                 sun.reflect.NativeMethodAccessorImpl.invoke0(Native
       Method)


              Now WHAT CAN THAT BE? Do you guys need any other info to
       analyze
              this issue?

              The CRUDAdmin method to list the Enquete is working quite
       nicely.

              Any help will be appreciated.

              Cheers all,

              Wellington


                     ------------------------------------------------------------------------

              _______________________________________________
              eclipselink-users mailing list
              eclipselink-users@xxxxxxxxxxx
       <mailto:eclipselink-users@xxxxxxxxxxx>
       <mailto:eclipselink-users@xxxxxxxxxxx
       <mailto:eclipselink-users@xxxxxxxxxxx>>

              https://dev.eclipse.org/mailman/listinfo/eclipselink-users

          _______________________________________________
          eclipselink-users mailing list
          eclipselink-users@xxxxxxxxxxx
       <mailto:eclipselink-users@xxxxxxxxxxx>
       <mailto:eclipselink-users@xxxxxxxxxxx
       <mailto:eclipselink-users@xxxxxxxxxxx>>

          https://dev.eclipse.org/mailman/listinfo/eclipselink-users



       ------------------------------------------------------------------------

       _______________________________________________
       eclipselink-users mailing list
       eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
       https://dev.eclipse.org/mailman/listinfo/eclipselink-users

   _______________________________________________
   eclipselink-users mailing list
   eclipselink-users@xxxxxxxxxxx <mailto:eclipselink-users@xxxxxxxxxxx>
   https://dev.eclipse.org/mailman/listinfo/eclipselink-users



------------------------------------------------------------------------

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users


Back to the top