无法在外部Jar文件中注入实体管理器

时间:2012-02-20 23:18:00

标签: spring jpa

我正在开发一个单独的java组件,它将打包为jar并添加到父项目中。将其作为组件的原因是因为明天我可能必须删除该代码并将其丢弃。 我面临的问题是正在开发的独立组件(jar文件)需要在有人调用其API时查询数据库。

我的父项目是使用Spring + Hibernate + JPA设置的。

我无法将父项目中的EntityManager注入到外部Jar中,该外部Jar在spring容器启动期间实例化。

这在概念上是否正确?还是可以这种方式来做?

我希望jar文件只是搭载在父项目定义的persistence.xml上,并使用在启动时加载的EntityManager。

修改 实体管理器以这种方式通过主webapp中的LocalContainerEntityManagerFactoryBean注入

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceWrapper" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform"  value="${hibernate.dialect}" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

父webapp中的abstractDAO按以下方式定义,PersistenceContext注释确实返回EntityManager,一切正常。

public abstract class AbstractDAO<T extends LMEntity> {

   @PersistenceContext(unitName = "LineManagement")
   protected EntityManager entityManager;

   @Autowired
   private DataSource dataSource;

   @Autowired
   private DAOSupport daoSupport;

   public void initHibernateStatistics() {
      HibernateStatistics.enableHibernateStatistics(entityManager);
   }

下面是jar文件中的DAO,我想要注入EntityManager,以便它可以使用已提供的那个

这是jar文件中的DAO

@Repository(value = "retryDAO")
public class RetryDAOImpl
  implements RetryDAO {

   @Autowired
   private EntityManager entityManager;

   @Transactional
   public void saveEvent(final IntegrationEvent event) {
      entityManager.merge(event);
   }

我尝试了@Autowired注释,它提到了entityManager bean不存在。

1 个答案:

答案 0 :(得分:0)

只要你有可能:

  • 在您的父应用程序和组件之间共享相同的Spring上下文
  • 或您的应用程序上下文是组件Spring上下文的父级。

此外,您需要确保Spring实际上实例化您的组件,以便它可以注入任何必要的内容。如果您使用基于注释的配置,则可能涉及组件扫描(即,您需要在<context:component-scan />中指定applicationContext.xml)。如果您使用传统的XML配置,<context:annotation-config />然后在applicationContext.xml中声明持久性组件就足够了。

对于父应用程序和JAR中的组件使用完全独立的上下文绝对不会起作用。