你好所有:我阅读了关于这一点的 Spring 季参考文献 .
我会选择在我的DAO中使用@PersistenceContext来注入共享事务实体管理器,但由于我在两个指向2个不同持久性单元的entityManagerFactories上使用GenericDaoJpaImpl模式,所以我无法使用它 .
所以现在在我的应用程序中我有这样的配置:
entityManagerFactoryies:
<bean id="entityManagerFactoryIban0" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:META-INF/contratto-persistence-iban0.xml" />
</bean>
<bean id="entityManagerFactoryCont0" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:META-INF/contratto-persistence-cont0.xml" />
</bean>
<bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false">
<property name="entityManagerFactory" ref="entityManagerFactoryIban0" />
</bean>
<bean abstract="true" id="abstractDaoJpaImplCont0" lazy-init="false">
<property name="entityManagerFactory" ref="entityManagerFactoryCont0" />
</bean>
然后我的每个DAO都是GenericDaoImpl的一个实例:
@Repository
public class GenericDaoJpaImpl<T, ID extends Serializable> implements GenericDao<T, ID> {
private Class<T> entityClass;
private EntityManagerFactory entityManagerFactory;
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
public GenericDaoJpaImpl() {
super();
}
public GenericDaoJpaImpl(Class<T> entityClass) {
super();
this.entityClass = entityClass;
}
/**
* @see it.alten.intesasanpaolo.contratto.dao.common.GenericDao#getItemByID(java.io.Serializable)
*/
@Override
public T getItemByID(ID id) {
EntityManager em = entityManagerFactory.createEntityManager();
return em.find(entityClass, id);
}
我以这种方式通过spring构建我的dao:
<bean id="eventMessageDao" parent="abstractDaoJpaImplCont0" class="it.alten.intesasanpaolo.contratto.dao.common.GenericDaoJpaImpl">
<constructor-arg>
<value>it.alten.intesasanpaolo.contratto.domain.event.OnlineEventMessage</value>
</constructor-arg>
</bean>
现在我想修改Spring文档中描述的GenericDaoJpaImpl不要与entityManagerFactory相关联,我必须每次从entityManager创建但直接创建entityManager .
我想在上下文中定义它,我可以将它注入正确的抽象dao,从每个dao扩展 .
<bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false">
<property name="entityManagerFactory" ref="entityManagerFactoryIban0" />
</bean>
我怎样才能做到这一点?
亲切的问候马西莫
2 回答
您可以使用
SharedEntityManagerBean
从EntityManagerFactory
构造事务EntityManager
:您可以使用
SharedEntityManagerBean
在xml配置中提供 persistence unit 名称,如下所示:当然,您可以将
SharedEntityManagerBean
作为单独的bean在这里,我正在使用
@PersistenceContext(unitName="...")
将entityManager
注入BaseDAO