2008-10-01 9 views
3

J'espère que je peux expliquer ce problème correctement. J'ai 3 classes qui traite de mes entités.JPA - Classe de bean entité inconnue

@MappedSuperclass 
public abstract class Swab implements ISwab { 
... 
    private Collection<SwabAccounts> accounts; 
... 
} 

@Entity 
@Table(name="switches") 
@DiscriminatorColumn(name="type") 
@DiscriminatorValue(value="DMS500") 
public class DmsSwab extends Swab implements ISwab, Serializable { 
... 
    private ObjectPool pool; 
... 
    @Transient 
    public ObjectPool getPool(){ 
     return pool; 
    } 
... 
} 

@Entity(name="swab_accounts") 
public class SwabAccounts implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int swab_account_id; 
    private int swab_id; 
... 
} 

Et dans un EJB une requête est en cours de faire de cette façon

DmsSwab dms = em.find(DmsSwab.class, 2); 
    List<Swab> s = new ArrayList<Swab>(1); 
    s.add(dms); 

Mon persistence.xml ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="dflow-pu" transaction-type="RESOURCE_LOCAL"> 
    <provider>oracle.toplink.essentials.PersistenceProvider</provider> 
    <class>com.dcom.sap.dms.DmsSwab</class> 
    <class>com.dcom.sap.jpa.SwabAccounts</class> 
    <properties> 
     <property name="toplink.jdbc.user" value="dflow"/> 
     <property name="toplink.jdbc.password" value="dflow"/> 
     <property name="toplink.jdbc.url" value="jdbc:mysql://itcd-400447:3306/dflow"/> 
     <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Je reçois cette erreur:

java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. 
com.dcom.sap.SwabException: java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. 
Caused by: java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. 
     at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.findInternal(EntityManagerImpl.java:306) 
     at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.find(EntityManagerImpl.java:148) 

Je cours netbeans 6.1 avec la version de gla Ssfish qui vient avec. MySql 5.0.

Répondre

1

Selon le message d'erreur et ce que je comprends de votre code, l'erreur semble être dans le fichier persistence.xml, pouvez-vous être un peu plus verbeux?

+1

J'ai trouvé la réponse. Netbeans/glassfish a besoin d'un peu de travail. J'ai dû annuler le déploiement, arrêter le serveur et redémarrer, puis cela a bien fonctionné. – arinte

+0

assurez-vous de fermer votre EntityManagerFactory sur undeploy – James

5

définir cette entité dans la balise de classe à l'intérieur du persistence.xml

0

J'ai eu la même erreur et, complétant les informations ci-dessus, mon cas était un problème de ClassLoader. Mon application a trois fichiers. Un ejb-module.jar qui dépend de app-lib.jar (bibliothèque qui contient des entités pojo et base de données) et un web-module.war qui dépend de app-lib.jar.

Lors du déploiement, le fichier app-lib.jar a été chargé deux fois par le glassfish. Googling, j'ai découvert que je devrais copier l'app-lib.jar à une lib "partagée" dans le domaine glassfish. J'ai copié le postgresql.jar à "domain-dir/lib" et mon app-lib.jar à "domain-dir/lib/applibs". Avoir fait, l'application a travaillé comme un charme.

L'explication utilisée peut être trouvée ici: http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html

0

Je résolu cette question la création d'un ContextListener à mon Web App, invoquant la fermeture de l'usine de gestionnaire d'entités à détruire contexte,:

public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    try { 
     logger.info("contextDestroyed..."); 
     LifeCycleManager lifeCycleManager = ServiceLocator.getLifeCycleManager(); 
     lifeCycleManager.closeEntityManagerFactory(); 

    } catch (Exception e) { 
     logger.error(e.getMessage(), e); 
    } 
} 

Je crée aussi un haricot avec le nom LifeCycleManager et à l'intérieur les invoquons une méthode DAO pour fermer l'usine de gestionnaire d'entités:

public void closeEntityManagerFactory() throws BusinessException { 
     logger.info("closeEntityManager"); 
     try { 
      logger.info("closing entity manager factory..."); 
      genericDAO.closeEntityManagerFactory(); 
      logger.info("Entity manager factiry closed"); 
     } catch (Exception e) { 
      throw new BusinessException(BusinessErrorCode.CODIGO_EJEMPLO_01, Severity.ERROR); 
     } 
    } 

insid e DAO:

...

@Autowired 
private EntityManagerFactory entityManagerFactory; 

...

public void closeEntityManagerFactory() { 
     logger.info("closing entity manager factory"); 
     getEntityManagerFactory().close(); 
     logger.info("entity manager factory closed"); 
    } 

En utilisant cette chaque fois que je déploie un changement de mon environnement éclipse le contexte de détruire est invoquée. J'espère pouvoir vous aider les gars, mon environnement est WebLogic Server 11gR1 et JPA 1.0.

Questions connexes