Consider having two entity manager factories:
<bean id="writeEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">...</bean>
<bean id="readOnlyEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">...</bean>
Then I want to have two Beans to which I would inject the correct persistence context:
<bean id="readOnlyManager" class="..MyDatabaseManager">
<bean id="writeManager" class="..MyDatabaseManager">
The bean would look something like:
public class MyDatabaseManager {
private javax.persistence.EntityManager em;
public EntityManager(javax.persistence.EntityManager em) {
this.em = em;
}
...
}
This obviously doesn't work, because EntityManager is not a bean and cannot be injected in this way:
No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
How can I qualify correct EntityManager in the bean? I used to use @PersistenceContext
annotation, but this is not usable as I need to inject it.
How can I specify the PersistenceContext for such Bean?
UPDATE: My question is how to inject PersistenceContext with qualifier via XML, not via annotation.
persistence.xml (2 persistence unit for 2 different entitymanager, based on your persistence provider here i ma using HibernatePersistence)
<persistence version="2.0" 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">
<persistence-unit name="pu1">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
<persistence-unit name="pu2">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
</persistence>
Make sure you are assigning the persistence-unit to entity manager using property persistenceUnitName
<bean id="writeEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath: of yout persistence xml" />
<property name="persistenceUnitName" value="pu1" />
.....other configuration of em..
</bean>
same for other em.
Now, use constructor injection for MyDatabaseManager to inject EntityManager (using qualifier name ex. writeEntityManagerFactory )
<bean id="mdm" class="MyDatabaseManager">
<constructor-arg ref = "writeEntityManagerFactory"/>
</bean>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With