2016-11-23 2 views
1

Ich arbeite mit Spring + JPA (mit Hibernate als JPA-Anbieter) mit Diensten und Dao.Spring + JPA EntityManager injiziert in Service und dao

Ich möchte die JPA EntityManager in Service und Dao injizieren, mit dem Dienst, der die Transaktionen verwaltet, und dem DAO, der die Objektpersistenz verwaltet.

Der Dao ist @Autowired im Service und der EntityManager wird sowohl in Service und Dao, mit @Autowired injiziert.

Auf diese Weise bin ich garantiert, die gleichen EntityManager sowohl im Service und im Dao injizieren?

+0

@shazin: Wie können Sie JPA EntityManager Bean Singleton oder Prototyp konfigurieren? – grsdev7

Antwort

2

Sie können EntityManager mit @PersistenceContext injizieren, wodurch der von Spring verwaltete gemeinsame EntityManager injiziert wird. Aber ich denke, dass Sie Ihren Ansatz von EM in Service-Klasse auch überdenken sollten.

Auch hier: Doc

Als OP Kommentare Aktualisierung: Sie können EntityManager nur in DAO-Klassen, sondern diejenigen sein atominc dao ruft in gleicher Service-Methode machen und machen es transactional.Check aus Two Dao atomic calls

+0

Der Punkt ist, dass ich sagen muss, ein Dao oder mehr, die verantwortlich sind, um meine Entitäten zu bestehen. Ich brauche einen Service, der die Transaktion abwickelt. Wenn ich es in den Daos mache, könnte ich im Falle von Fehlern schmutzige Transaktionen haben. Wie kann ich es sonst schaffen? – Massimo

+0

@Massimo Sie können EntityManager nur in DAO-Klassen haben, aber diese zu atominc-Dao-Aufrufe in der gleichen Service-Methode machen und es transaktional machen.Check out http://StackOverflow.com/Questions/3886909/Where-should-transactional-be -Place-Service-Schicht-oder-Dao – grsdev7

+0

Danke, es ist, was ich brauche, bitte aktualisieren Sie Ihre Antwort, damit ich als Lösung markieren – Massimo

0

Haben Sie @PersistenceContext Anmerkung

@PersistenceContext 
private EntityManager entityManager; 

Werfen Sie einen Blick auf diese link für weitere Informationen versucht. Sehen Sie auch here für alle möglichen Optionen, die Sie mit dieser Anmerkung haben.

1

EntityManager wird als Singleton-Bean initialisiert. Sie müssen sich also keine Sorgen machen, solange Sie sicherstellen, dass Sie die richtige EntityManager-Bean verdrahten, falls 2 oder mehr in Ihrer Anwendung konfiguriert sind.

@PersistenceContext(unitName = "<persistent-unit-name>") 
    private EntityManager entityManager; 


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
     <property name="persistenceUnitName" value="<persistent-unit-name>" /> 
    ... 
    </bean> 
2

Sein völlig falsche Weg, aber alle EntityManager-Instanzen mit EntityManagerFactoryBean erstellen. Wenn Sie @Bean erstellt haben, kann nicht garantiert werden, dass Sie dieselbe Instanz von EntityManager haben.

Verwandte Themen