【问题标题】:Spring JPA - org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean cannot be cast to javax.persistence.EntityManagerFactorySpring JPA - org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 无法转换为 javax.persistence.EntityManagerFactory
【发布时间】:2014-09-30 20:13:45
【问题描述】:

目前我正在尝试让 JPA 示例与 Spring Boot 一起使用

(http://spring.io/guides/tutorials/data/3/).

当我使用示例中的代码时:

@Bean
public DataSource dataSource() throws SQLException {

EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.H2).build();
}

@Bean
public EntityManagerFactory entityManagerFactory() throws SQLException {

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);

LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.yummynoodlebar.persistence.domain");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();

return factory.getObject();
}

@Bean
public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}

@Bean
public PlatformTransactionManager transactionManager() throws SQLException {

JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
return txManager;
}

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}

我总是收到异常“原因:java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$3cbaf28d cannot be cast to javax.persistence.EntityManagerFactory”。

我将这个示例与我自己的数据源一起使用:

@Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("user");
        dataSource.setMaxTotal(5);
        dataSource.setInitialSize(2);
        dataSource.setPassword("pw");
        dataSource.setUrl("jdbc:mysql://localhost/data");
        return dataSource;
    }

当我改变一些东西时,一切正常:

我将“EntityManagerFactory”-方法更改为:

public LocalContainerEntityManagerFactoryBean entityManagerFactory() ...

以及transactionManager方法:

public PlatformTransactionManager transactionManager(
        EntityManagerFactory emf) throws SQLException {

并通过方法变量“emf”直接设置EntityManagerFactory。

这是为什么呢?

有人可以向我解释为什么教程中的示例不起作用吗?我正在为这个项目使用 mysql 驱动程序。

谢谢!

问候

【问题讨论】:

  • 我在这里遇到了完全相同的问题。
  • 我发布了那个解决方案^^我只是想知道为什么spring.io网站的代码不起作用。
  • 我写了一篇你可能感兴趣的博客jasenkoh.blogspot.com/2014/11/…
  • 我已将 entityManagerFactory() 方法的返回类型更改为 LocalContainerEntityManagerFactoryBean ,这对我来说没问题。我有一个带有两个不同数据源的 Spring Boot 项目,我必须为每个配置编写 transactionManager() entityManagerFactory() 等...以区分两个数据源的使用。

标签: java spring hibernate jpa spring-data


【解决方案1】:

这可能会有所帮助:

@Bean
    public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        transactionManager.setDataSource(dataSource());
        transactionManager.setJpaDialect(jpaDialect());
        return transactionManager;
    }

【讨论】:

  • 只是为了拼出 Oleksii 的答案 - 将 EntityManagerFactory 移出作为方法参数,而不是在 transactionManager 方法本身中调用 entityManagerFactory() 方法。 (我最初忽略了这个细节)
【解决方案2】:

尝试在 XML 配置中创建 TransactionManager,如下所示:

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

并使用注解导入:

@ImportResource("classpath*:/config.xml")

【讨论】:

    猜你喜欢
    • 2022-10-07
    • 2019-11-09
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2020-01-30
    相关资源
    最近更新 更多