在训练 Spring MVC + JPA/Hibernate 项目中,在更改配置后,我收到了相关错误。
原本DAO类是这样的:
public Course getById(Integer id) throws DAOException {
Course result = null;
try {
EntityManager em = emf.getFactory().createEntityManager();
result = em.find(Course.class, id);
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw new DAOException("Could not get Course By Id", e);
}
return result;
}
我被告知要用 @PersistenceContext
生成
EntityManager,并避免时不时地创建新的 EntityManager。所以我用
EntityManager em = ...
字段替换了上面的 @Autowired EntityManager em;
行,并更改了 JpaConfig 类,所以它看起来像:
@Configuration
@ComponentScan(basePackages = "com.example.school")
@PropertySource("classpath:database.properties")
@EnableTransactionManagement
public class JpaConfig {
private final Environment environment;
@Autowired
public JpaConfig(Environment environment) {
this.environment = environment;
}
@Autowired
DataSource dataSource;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.school");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
以前的配置文件就是这么简单:
@Configuration
public class EntityManagerConfig {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU");
@Bean
EntityManager em() {
return emf.createEntityManager();
}
}
现在我得到一个堆栈跟踪,其中包含以下最重要的问题:
org.springframework.beans.factory.UnsatisfiedDependencyException ...
...
引起:org.springframework.beans.factory.BeanNotOfRequiredTypeException:名为“courseDAO”的 Bean 预计为“com.example.school.dao.CourseDAO”类型,但实际上为“com.sun.proxy.$Proxy49”类型' 在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1317)
此配置可能存在什么问题?
你为什么给你的豆子命名为
entityManagerFactory
?它可能会破坏其他依赖于 Hibernate 类型的 Bean EntityManagerFactory
。例如将其重命名为 localContainerEntityManagerFactory
。