2017-09-22 1 views
0

Lorsque je lance l'application, il ne s'agit pas de ces propriétés mais des propriétés par défaut dans glassfish-ressource.xml. J'utilise JPA avec des beans et des entités générés automatiquement par nebeans. Je veux changer de base de données à l'exécution.JPA EntityManagerFactory ne remplace pas le fichier persistence.xml

Voici sa ma classe session

package facade; 
import entities.Tpe; 
import java.util.HashMap; 
import java.util.Map; 
import javax.annotation.PostConstruct; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.PersistenceContext; 

/** 
* 
* @author Emmanuel 
*/ 
@Stateless 
public class TpeFacade extends AbstractFacade<Tpe> { 
    private EntityManager em; 
    @Override 
    public EntityManager getEntityManager() { 

    EntityManagerFactory emf=null; 
    Map properties = new HashMap(); 
    properties.put("javax.persistence.transactionType", "JTA"); 
    properties.put("javax.persistence.jdbc.driver", "jdbc:mysql://192.20.3.81:3306/piv?zeroDateTimeBehavior=convertToNull"); 
    properties.put("javax.persistence.jdbc.url", "com.mysql.jdbc.Driver"); 
    properties.put("javax.persistence.jdbc.database", "piv"); 
    properties.put("javax.persistence.jdbc.user", "username"); 
    properties.put("javax.persistence.jdbc.password", "password"); 

    try { 
     emf = Persistence.createEntityManagerFactory("ConfigurationTPEPU", properties); 
     System.out.println("emfznezizzhzz "+emf.getProperties()); 
    } catch (Exception e) { 
    } 
    em = (EntityManager) emf.createEntityManager(); 
    return em ; 
} 


    public TpeFacade() { 
     super(Tpe.class); 
    } 

} 

et le contenu de mon fichier de persistance

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="ConfigurationTPEPU" transaction-type="JTA"> 
    <jta-data-source>java:app/connexion81</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    </persistence-unit> 

</persistence> 

le contenu GlassFish-ressources.xml

<resources> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_piv_rootPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
     <property name="serverName" value="localhost"/> 
     <property name="portNumber" value="3306"/> 
     <property name="databaseName" value="db1"/> 
     <property name="User" value="root"/> 
     <property name="Password" value="gsmcom"/> 
       <property name="URL" value="jdbc:mysql://localhost:3306/petroivoire?zeroDateTimeBehavior=convertToNull"/> 

     <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    </jdbc-connection-pool> 
    <jdbc-resource enabled="true" jndi-name="java:app/connexion81" object-type="user" pool-name="mysql_piv_rootPool"/> 
</resources> 
+0

ce sera un plaisir si quelqu'un peut m'aider. ce trois jours que ce problème a arrêté ma progression. Et désolé pour mon anglais –

+0

Qu'est-ce qui vous pose un problème? Vous avez défini une unité de persistance avec certaines propriétés MAIS les avez surpassées lors de la création de l'EMF, de sorte qu'elle utilise les remplacements si nécessaire. Tout comme les Javadocs disent que cela devrait être – DN1

+0

Ce n'est pas un bon style Java EE que vous faites car vous n'utiliserez pas le pooling de connexion et l'EJB Stateless créera une instance EntityManagerFactory par pool. Pourquoi voulez-vous changer de base de données et ne pas utiliser la source de données? –

Répondre

0

Vous devriez comprendre que, pour un @EJB le serveur d'application est là pour t akes de l'inetiation du @EJB mais aussi de l'injection de la persistance.

La configuration utilisée est celle déjà disponible dans le domaine Glassfish (domain/config/domain.xml) et non ces propriétés du fichier glassfish-ressource.xml.

Cela signifie, pour override la première configuration que vous avez à utiliser deux persistances et:

  1. basculer entre eux par programme (lorsque l'on injecte à la fois).

  2. Ou utilisez Persistence.createEntityManagerFactory (jndiDataSource2NdUnitName) .createEntityManager(); où jndiDataSource2NdUnitName est le nom de la seconde unité.

+0

merci beaucoup d'avance, je l'ai très bien compris, mais j'ai un problème je veux ajouter une nouvelle base de données sans Redoploy mon application. Parce que avec la méthode que vous avez donné pour ajouter une nouvelle base de données avec obligation de modifier le persistence.xml en ajoutant la nouvelle configuration de base de données. il n'y a pas une autre méthode pour ajouter une nouvelle base de données par programme. merci –

+0

Selon les spécifications, il est impossible d'ajouter une unité de persistance de manière dynamique. Mais si vous n'utilisez pas un serveur APP, désolé je n'ai pas une idée. – bilelovitch

+0

merci beaucoup je vais essayer différemment –