Hibernate EntityManager, est-il censé être utilisé comme un singleton?
Je ne suis pas à l'aide de Printemps, je suis donc la création d'une instance de l'EntityManager au sein d'une classe.
J'ai utilisé Hibernate, Eclipse, l'ingénierie inverse à l'auto-générer les classes. Ces classes dispose d'une instance de l'EntityManager.
Je ne suis pas 100% sûr de savoir comment Hibernate travaille avec l'EntityManager alors je me demande si il est normal que de nombreuses instances de cette classe (EntityManager) sont faites, par exemple, aura-t-il des problèmes avec les transactions?
Dois-je simplement faire une catégorie distincte qui distribue une instance statique d'un EntityManager pour tous mes autres classes? ou n'est-il pas d'importance?
EDIT: je vois il y a quelque chose qui s'appelle @PersistenceContext, il ne semble pas à charger mon persistence.xml comme un haricot à la variable d'instance, cette fonction nécessite le printemps? (J'ai exception de pointeur null, parce qu'il n'a jamais été injecté)
capture de code à partir d'où je tente de l'utiliser @persistencecontext
@PersistenceContext(unitName = "manager1")
private EntityManager entityManager;
mon persistence.xml
<persistence 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_2_0.xsd"
version="2.0">
<persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="mypassword"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/ptbrowserdb"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
</persistence>
EntityManager
) et de tester?OriginalL'auteur | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
Voir cet Article: JPA Architecture il très bien l'expliquer.
En Général, vous avez besoin d'une seule Entité Gestionnaire par transaction. Et cette Entité Gestionnaire ne doit pas être utilisé dans les deux opérations en même temps.
Clairification: je veux dire, ne pas utiliser une seule Entité Gestionnaire pour les différentes unités d'œuvres. Typique d'une transaction dans une unité de travail, si vous avez différentes opérations d'une unité de travail, alors vous pouvez utiliser la même Entité Gestionnaire de
Si vous utilisez Printemps, Printemps de faire cette manipulation pour vous si vous utilisez le
@PersistenceContext
annotation d'injecter de l'EntityManager. Par défaut Printemps "lier" la injectés EntityManager (via un proxy) pour la transaction en cours. (Et la transaction est "lié" à la discussion.)@Voir Printemps de Référence 13.5.2 la mise en Œuvre de DAOs basé sur la plaine de la JPA - il contient une intéressante paragagraph après les exemples de code.
C'est un article intéressant, mais il est à propos de Hibernate "vieux" Session/SessionFactory modèle, mais cette question est à propos de JPA. Comme un prix que je sais que cela dans l'un des rares sujets où JPA et Hibernate-Session diffère. Jetez un oeil au chapitre "5.1. L'entité gestionnaire de transaction et étendues" dans le docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/... - elle l'affirme: "Un EntityManager est un peu coûteux, non thread-safe objet qui doit être utilisé une fois, pour un seul processus d'affaires, une seule unité de travail, puis rejetés."
et un seul processus peut se composer de plusieurs transactions de droit? Ou vous êtes en désaccord. Ne dit-on pas dans mon lien je l'ai supposé mettre plus d'une transaction dans une session, sinon, ce serait un antipattern?
Le point est: ne pas utiliser un EntityManager instance pour plus d'un processus d'affaires.
OriginalL'auteur Ralph
Vous avez besoin d'une injection de dépendance framework comme Spring ou Google Guice à injecter des objets dans votre classe sinon il ne peut pas être injecté automatiquement pour vous.
Fondamentalement, c'est une annotation fournis par JPA, qui travaillera en tandem avec mise en veille prolongée ou de tout autre ORM pour dire, mais vous avez besoin d'un DI-cadre pour injecter les objets.
Concernant la seule instance de l'entité gestionnaire, je ne pense pas que vous avez besoin que si vous allez par le Printemps depuis qu'il s'occupe de gérer les instances et les transactions pour vous en liant votre entité gestionnaire de l'apc de transaction.
Vous n'avez pas besoin d'une Injection de Dépendance cadre: vous pouvez le faire par vos propres: dans une application web par exemple avec une bande de roulement local de portefeuille le gestionnaire d'entité et un EntityManagerPerRequestPatternFilter
Oui je suis d'accord, nous pouvons faire l'injection par nous-mêmes, mais pour éviter la surcharge, nous avons prouvé, cadres de DI..du printemps ou de guice de manière transparente le faire pour nous..à condition que ces devrait être le cadre de l'application de la pile..
Subbiah: avez-vous et Rodrigo Salazar fonctionnent sur le même projet?
non, nous ne sommes pas
OriginalL'auteur raddykrish