java - 设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;
问题描述
我的代码中出现此错误。
org.springframework.beans.factory.BeanCreationException:创建名为“roleRepository”的bean时出错:在设置bean属性“entityManager”时,无法创建类型为[org.springframework.orm.jpa.SharedEntityManagerCreator]的内部bean“(内部bean)#7540dc57” '; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(内部 bean)#7540dc57”的 bean 时出错:设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
我看到了这些:
设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用
NoSuchBeanDefinitionException:没有名为“entityManagerFactory”的bean可用
NoSuchBeanDefinitionException:没有定义名为“entityManagerFactory”的bean
他们都没有回答我的问题。问题是我能够解决问题,但我对此有疑问。
让我分享我的相关代码,然后问我有什么问题。
@Configuration
@EnableTransactionManagement
public class HibernateConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerF() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] {"com.gitreporter"});
JpaVendorAdapter jpaAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(jpaAdapter);
em.setJpaProperties(jpaProperties());
return em;
}
@Bean
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory emf) {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(emf);
return jpaTransactionManager;
}
private final Properties jpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/MyDBNAME?useSSL=false");
dataSource.setUsername("username");
dataSource.setPassword("password");
return dataSource;
}
问题出在这一行:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerF() {
我将方法名称更改为 entityManagerFactory,如下所示:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
使上下文中的工厂 bean 的名称等于“entityManagerFactory”,因为默认情况下,除非明确指定,否则 bean 的名称将等于方法名称。
我的问题:JPA API 中是否有一个地方“按照惯例”在 Spring 容器中寻找名为“entityManagerFactory”的 EntityManagerFactory bean?当方法的名称是“entityManagerF”时,为什么它不起作用?
这是其余的代码:
@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public List<T> findByAttributeContainsText(String attributeName, String text);
}
public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
implements GenericRepository<T, ID> {
private EntityManager entityManager;
public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
}
public interface RoleRepository extends GenericRepository<Role, Long> {
}
解决方案
我找到了答案。
查看 @EnableJpaRepositories 注释的文档。
在可选元素中,您将看到:
entityManagerFactoryRef 配置 EntityManagerFactory bean 定义的名称,用于创建通过此注释发现的存储库。
转到页面的详细信息,您将看到:
entityManagerFactoryRef
公共抽象字符串 entityManagerFactoryRef
配置 EntityManagerFactory bean 定义的名称,用于创建通过此注释发现的存储库。默认为 entityManagerFactory。
回报:
默认值:“实体管理器工厂”
所以这个“常规”的默认配置来自@EnableJpaRepositories 注解本身。
推荐阅读
- c++ - leetcode 394 的时间复杂度
- javascript - Cal热图显示nan值其他颜色
- javascript - 收到来自 Lambda 的无效响应:无法识别的字段
- javascript - 从根组件反应本机访问功能
- java - 显示到列表视图上的图像视图单击
- python - 如何使用模型对象作为 django-filter MultipleChoiceFilter 的选择
- javascript - 将复制到剪贴板的 jQuery 代码转换为纯 JavaScript
- ssl - 浏览器在 TLS/HTTPS 中发送多少数据包?
- java - 为什么我得到一个空指针访问?
- datatables - DataTables:无法读取未定义的属性“长度”,但 JSON 有效