【问题标题】:Spring @PersistenceContext how to inject manually the entity manager in my GenericDaoSpring @PersistenceContext 如何在我的 GenericDao 中手动注入实体管理器
【发布时间】:2011-06-01 13:40:36
【问题描述】:

大家好: 我阅读了关于这一点的弹簧参考资料。

我会选择在我的 DAO 中使用 @PersistenceContext 来注入一个共享事务实体管理器,但是由于我在两个指向两个不同持久性单元的 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,使其不与我每次都必须从中创建 entityManager 的 entityManagerFactory 相关联,而是直接与 entityManager 相关联。

我想在上下文中定义它,我可以将它注入正确的抽象 dao 以从每个 dao 扩展。

<bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false">
        <property name="entityManagerFactory" ref="entityManagerFactoryIban0" />
    </bean>

我怎样才能做到这一点?

亲切的问候 马西莫

【问题讨论】:

    标签: spring entitymanager


    【解决方案1】:

    您可以使用SharedEntityManagerBeanEntityManagerFactory 构造一个事务性EntityManager

    <bean id="entityManagerFactoryIban0" 
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">            
        ... 
    </bean> 
    
    <bean id="entityManagerIban0"  
        class="org.springframework.orm.jpa.support.SharedEntityManagerBean">            
        <property name="entityManagerFactory" ref="entityManagerFactoryIban0" />
    </bean> 
    
    <bean abstract="true" id="abstractDaoJpaImplIban0" lazy-init="false">
        <property name="entityManager" ref="entityManagerIban0" />
    </bean> 
    

    【讨论】:

      【解决方案2】:

      您可以在 xml 配置中提供 持久性单元 名称,使用 SharedEntityManagerBean,如下所示:

      <bean id="testDao" class="com.test.persistence.dao.BaseDAO">
          <property name="entityManager">
              <bean class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
                  <property name="persistenceUnitName" value="persistence-test-unit" />
              </bean>
          </property>
      </bean>
      

      当然,您可以将 SharedEntityManagerBean 作为单独的 bean

      在这里,我将entityManager 注入BaseDAO,就像您使用@PersistenceContext(unitName="...") 所做的那样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        相关资源
        最近更新 更多