82 votes

Créer Gestionnaire d'Entité sans persistence.xml

Est-il possible d'initialiser l'EntityManager sans une unité de persistance? Pouvez-vous donner toutes les propriétés requises pour créer un gestionnaire d'entité? J'ai besoin de créer un EntityManager de l'utilisateur valeurs spécifiées au moment de l'exécution. La mise à jour de la persistence.xml et la recompilation n'est pas une option.

Aucune idée sur la façon de le faire est plus que bienvenue!

57voto

Arthur Ronald Points 19001

Est-il possible d'initialiser l'EntityManager sans une unité de persistance ?

Vous devez définir au moins une unité de persistance dans l'persistence.xml le descripteur de déploiement.

Pouvez-vous donner toutes les propriétés requises pour créer un gestionnaire d'entité ?

  • Le nom de l'attribut est requis; les autres attributs et les éléments sont en option. (Spécification JPA)

...

<persistence>
    <persistence-unit name="<REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE>">
        SOME_PROPERTIES
    </persistence-unit>
</persistence>

Dans les environnements Java EE, le jta-data-source et non-jta-data-source-éléments sont utilisés pour spécifier le nom JNDI global de la JTA et/ou de non-source de données JTA à être utilisés par le fournisseur de persistance.

Donc, si votre Serveur d'Applications cible prend en charge JTA (JBoss, Websphere, GlassFish), votre persistence.xml ressemble

<persistence>
    <persistence-unit name="<REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE>">
        <!--GLOBAL_JNDI_GOES_HERE-->
        <jta-data-source>jdbc/myDS</jta-data-source>
    </persistence-unit>
</persistence>

Si votre Serveur d'Applications cible ne prend pas en charge JTA (Tomcat), votre persistence.xml ressemble

<persistence>
    <persistence-unit name="<REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE>">
        <!--GLOBAL_JNDI_GOES_HERE-->
        <non-jta-data-source>jdbc/myDS</non-jta-data-source>
    </persistence-unit>
</persistence>

Si votre source de données n'est pas lié à une JNDI global (par exemple, à l'extérieur d'un conteneur Java EE), de sorte que votre persistence.xml ressemble

Vous définissez en général JPA fournisseur du pilote, l'url, l'utilisateur et le mot de passe de propriétés. Mais le nom de la propriété dépend de la JPA fournisseur. Je vais vous montrer Hiberner comme fournisseur JPA

<persistence>
    <persistence-unit name="<REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE>">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>br.com.persistence.SomeClass</class>
            <properties>
                <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/>
                <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
                <property name="hibernate.connection.username" value="APP"/>
                <property name="hibernate.connection.password" value="APP"/>
            </properties>
    </persistence-unit>
</persistence>

Type De Transaction De L'Attribut

En général, dans les environnements Java EE, un type de transaction RESOURCE_LOCAL suppose qu'un non-source de données JTA seront fournis. Dans un environnement Java EE, si cet élément n'est pas spécifié, la valeur par défaut est JTA. Dans un environnement Java SE, si cet élément n'est pas spécifié, un défaut de RESOURCE_LOCAL est utilisée.

  • Pour assurer la portabilité de Java SE demande, il est nécessaire de mentionner la persistance gérée par les classes qui sont inclus dans l'unité de persistance (spécification JPA)

J'ai besoin de créer un EntityManager de l'utilisateur valeurs spécifiées au moment de l'exécution

Donc de l'utiliser

Map addedOrOverridenProperties = new HashMap();

// Let's suppose we are using Hibernate as JPA provider
addedOrOverridenProperties.put("hibernate.show_sql", true);

Persistence.createEntityManagerFactory(<PERSISTENCE_UNIT_NAME_GOES_HERE>, addedOrOverridenProperties);

en ce qui concerne,

29voto

Lando Points 666

Oui, vous pouvez, sans l'aide de n'importe quel fichier xml à l'aide de printemps comme ceci à l'intérieur d'un @classe de Configuration (ou son équivalent printemps config xml):

@Bean
public LocalContainerEntityManagerFactoryBean emf(){
    properties.put("javax.persistence.jdbc.driver", dbDriverClassName);
    properties.put("javax.persistence.jdbc.url", dbConnectionURL);
    properties.put("javax.persistence.jdbc.user", dbUser); //if needed

    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setPersistenceProviderClass(org.eclipse.persistence.jpa.PersistenceProvider.class); //If your using eclipse or change it to whatever you're using
    emf.setPackagesToScan("com.yourpkg"); //The packages to search for Entities, line required to avoid looking into the persistence.xml
    emf.setPersistenceUnitName(SysConstants.SysConfigPU);
    emf.setJpaPropertyMap(properties);
    emf.setLoadTimeWeaver(new ReflectiveLoadTimeWeaver()); //required unless you know what your doing
    return emfConfigBean;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X