【问题标题】:Inject entity manager from XML in Spring在 Spring 中从 XML 注入实体管理器
【发布时间】:2012-09-05 10:55:41
【问题描述】:

我需要做与Injecting Entitymanager via XML and not annnotations 中描述的非常相似的事情,但我需要从 XML 中注入真正的、容器创建的实体管理器,以便它的行为与真正的 @PersistenceContext 注释完全一样.我找到了一个 LocalEntityManagerFactoryBean(注意缺少“Container”字样),但我担心它会创建一个新的实体管理器工厂,因此实体管理器将与通过真正的 @PersistenceContext 注释注入的不兼容。

我将描述原因,因为它很奇怪,也许我的问题的解决方案是选择完全不同的方法。我在我的 spring 配置中使用 PropertyPlaceholderConfigurer,在这个配置器中我引用了其他 bean。我遇到了一个错误,即自动装配在那些引用的 bean 中不起作用。我不知道 PropertyPlaceholderConfigurer 为什么以及如何关闭那些引用的 bean 中的自动装配,但事实是,如果我用这些 bean 的 xml 配置替换自动装配,一切正常。但是我无法替换 EntityManager 的自动装配,因为它不是标准的 spring bean,而是 jndi 加载的我不完全理解的东西。

一种方法或另一种方法,有什么解决办法吗?

【问题讨论】:

  • 据我所知,由SharedEntityManagerBean 创建的EntityManager 从您提到的答案中的行为与通过@PersistenceContext 注入的EntityManager 完全相同。
  • SharedEntityManagerBean 需要注入 entityManagerFactory,我不知道该注入什么。

标签: java spring jpa


【解决方案1】:

在 spring-bean.xml 中,

<bean id="entityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="USER_TEST"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/>
    </property>
    <property name="jpaPropertyMap">
        <props>
            <prop key="eclipselink.weaving">false</prop>
        </props>
    </property>

<bean id="PersonDao" class="com.xxx.java.person.persistence.PersonDAO">
     <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

【讨论】:

  • 这几乎正是与我的问题相关的问题中描述的内容。这种方法的问题在于 LocalContainerEntityManagerFactoryBean 完全自定义 JPA 初始化,独立于容器中的初始化。我需要拥有与容器创建的相同的基础架构。
  • @calavera.info:那么,您有一个创建 JPA 基础设施的容器并想要使用它,或者您想要创建“与容器创建的基础设施相同的基础设施”?
  • 第一个选项 - 我想使用容器创建的 JPA 基础设施。我只是不知道如何在 XML 中访问它,并且通过 @PersistenceContext 注入不起作用。
【解决方案2】:
<bean id="earlyInitializedApplicationSettingsService" class="...services.impl.ApplicationSettingsServiceImpl" autowire-candidate="false">
    <property name="applicationSettingsDao">
        <bean class="....impl.ApplicationSettingsDaoImpl">
            <property name="entityManager">
                <bean class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
                    <property name="entityManagerFactory">
                        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                            <property name="jndiName" value="java:comp/env/persistence/somePersistenceUnit"/>
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

主要注意一个事实,即我没有使用标准的 jee:jndi-lookup,因为它不起作用(在 PropertyPlaceholderConfigurer 创建的条件下),这是我困惑的根源。当我直接使用 JndiObjectFactoryBean 时,它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多