我需要对Injecting Entitymanager via XML and not annnotations中描述的内容做非常类似的事情,但是我需要从XML注入真实的,容器创建的实体管理器,这样它的行为就像真正的@一样PersistenceContext注释。我找到了一个LocalEntityManagerFactoryBean(注意缺少“Container”字样),但我很担心它会创建一个新的实体管理器工厂,因此实体管理器与通过真实@PersistenceContext注释注入的实体管理器不兼容。
我将描述原因,因为它很奇怪,也许解决我的问题的方法是选择完全不同的方法。我在我的spring配置中使用PropertyPlaceholderConfigurer,在这个配置器中我引用了其他bean。我遇到了一个错误,即自动装配在那些引用的bean中不起作用。我不知道为什么以及PropertyPlaceholderConfigurer如何在这些引用的bean中关闭自动装配,但事实是,如果我用这些bean的xml配置替换自动装配,一切正常。但是我无法替换EntityManager的自动装配,因为它不是标准的spring bean,而是jndi-loaded,我还不完全理解。
有这样或那样的解决方案吗?
答案 0 :(得分:0)
在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>
答案 1 :(得分:0)
<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时,它工作。