2010-04-14 6 views
0

Nouveauté d'EJB3, aidez-nous/expliquez.Impossible de créer EntityManager

l'intérieur d'un bean session Je déclare un EntityManager que suivre

@PersistenceContext(unitName="ScheduleUnit") 
private EntityManager em; 

et cela fonctionne. Mais quand je fais

private EntityManager em; 
private EntityManagerFactory emf; 

public void myFunction() { 
    emf = Persistence.createEntityManagerFactory("ScheduleUnit"); 
    em = emf.createEntityManager(); 
} 

Je reçois l'erreur suivante:

A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property 

Répondre

0

Je pense que EntityManagerFactory ne trouve pas la source de données spécifiée dans votre unité de persistance. En ce qui concerne Glassfish, cette information est stockée dans le fichier sun-resources.xml. Est-ce une application j2ee? Si c'est le cas, il est préférable d'utiliser l'injection de dépendance avec l'annotation @PersistenceContext (comme dit Pascal).

En outre, vous pouvez essayer d'utiliser la méthode createEntityManagerFactory(String persistenceUnitName, Map properties) et spécifier "ConnectionDriverName" propety dans propriétés carte:

private EntityManager em; 
private EntityManagerFactory emf; 

public void myFunction() { 
    HashMap<String, String> properties = new HashMap<String, String>(); 
    properties.put("ConnectionDriverName", "org.postgresql.Driver"); //as for Postgres 
    emf = Persistence.createEntityManagerFactory("ScheduleUnit", properties); 
    em = emf.createEntityManager(); 
} 
+0

Et voyez cet article, si vous écrivez j2se app: http://java.sun.com/developer/technicalArticles/J2SE/Desktop/persistenceapi/ – Dmitry

+0

Merci Dmitry, J'utilise Genonimo au lieu de Glassfish pour le serveur J2EE. J'ai correctement configuré la source de données.
Voici mon persistence.xml: org.apache.openjpa.persistence.PersistenceProviderImpl myDatasource com.skomarcorp.Schedule. Pouvez-vous expliquer la différence entre utiliser @PersistenceContext et EntityManagerFactory et pourquoi l'un est meilleur que l'autre? – duvo

+0

L'utilisation d'annotations simplifie le code :) Dans ce cas, le conteneur (geronimo) résout automatiquement le lien vers votre gestionnaire d'entités et le cycle de vie de l'instance EntityManager est géré par conteneur. Voir ceci http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqw.html – Dmitry

0

On ne sait pas où vous utilisez le deuxième extrait de code (est-il dans un EJB si oui, vous n'êtes pas censé? pour utiliser le EntityManagerFactory dans un environnement géré comme un conteneur EJB). Pourriez-vous clarifier?

Veuillez également montrer votre persistence.xml (le message d'erreur concerne ce fichier ne contenant pas les informations requises).

+0

Merci pour la réponse Pascal. Oui, c'est dans un EJB. Pour mon application, chaque client a sa propre base de données mais la logique d'entreprise est la même pour tous, et je pensais pouvoir créer une unité de persistance (PU) pour chaque client et sélectionner l'unité centrale correspondante au moment de l'exécution. Voici mon persistence.xml: org.apache.openjpa.persistence.PersistenceProviderImpl MyDataSource com.skomarcorp.Schedule duvo

Questions connexes