我正在开发一个单独的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不存在。
答案 0 :(得分:0)
只要你有可能:
此外,您需要确保Spring实际上实例化您的组件,以便它可以注入任何必要的内容。如果您使用基于注释的配置,则可能涉及组件扫描(即,您需要在<context:component-scan />
中指定applicationContext.xml
)。如果您使用传统的XML配置,<context:annotation-config />
然后在applicationContext.xml
中声明持久性组件就足够了。
对于父应用程序和JAR中的组件使用完全独立的上下文绝对不会起作用。