2017-09-22 55 views
0

当我午餐应用程序时,它不采取这些属性,而是glassfish-ressource.xml中的默认属性。我正在使用带有nebeans自动生成的bean和实体的JPA。我希望在运行时切换数据库。JPA EntityManagerFactory不覆盖persistence.xml文件

他在这里的我的会话类

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); 
    } 

} 

和我的持久性文件,内容

<?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> 

了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

如果有人能帮助我,那将是我的荣幸。这三天这个问题阻止了我的进展。对不起,我的英语 –

+0

你到底有什么问题?你用一些属性定义了一个持久性单元,但是在创建EMF时将它们取代了它们,所以它在必要时使用覆盖。就像Javadocs说的那样 – DN1

+0

这不是一种好的Java EE风格,因为您不会使用连接池,而无状态EJB将为每个池实例创建一个EntityManagerFactory。为什么要切换数据库而不使用数据源? –

回答

0

你应该理解的是,对于@EJB应用程序服务器在这里t关心@EJB的吸引力,而且注重持久性。

使用的配置是Glassfish域(domain/config/domain.xml)中已有的配置,而不是glassfish-ressource.xml文件的这些属性。

这意味着,覆盖你已经第一个配置使用两个不放过和:编程它们之间

  1. 开关(二者同时注射时)。

  2. 或使用Persistence.createEntityManagerFactory(jndiDataSource2NdUnitName).createEntityManager();其中jndiDataSource2NdUnitName是第二个单元名称。

+0

非常感谢你领导,我很了解它,但我有一个问题,我想添加一个新的数据库与redoploy我的应用程序。因为使用了您添加新数据库的方法,通过添加新的数据库配置来强制修改persistence.xml。没有其他方法以编程方式添加新的数据库。谢谢 –

+0

根据规范,不可能以动态方式添加持久性单元。但如果你不使用APP服务器,对不起,我不知道。 – bilelovitch

+0

非常感谢你,我会尝试不同的方式 –