Я получаю эту ошибку в своем коде.
org.springframework.beans.factory.BeanCreationException: ошибка
создание компонента с именем roleRepository: невозможно создать внутренний компонент
'(внутренний бин) # 7540dc57' типа
[org.springframework.orm.jpa.SharedEntityManagerCreator] при настройке
свойство бина 'entityManager'; вложенное исключение
org.springframework.beans.factory.BeanCreationException: ошибка
создание компонента с именем '(внутренний компонент) # 7540dc57': не удается разрешить
ссылка на bean-компонент "entityManagerFactory" при установке конструктора
аргумент; вложенное исключение
org.springframework.beans.factory.NoSuchBeanDefinitionException: нет
бин с именем entityManagerFactory доступен
Я видел это:
Невозможно разрешить ссылку на bean-компонент "entityManagerFactory" при установке аргумента конструктора
NoSuchBeanDefinitionException: недоступен компонент с именем entityManagerFactory
NoSuchBeanDefinitionException: не определен боб с именем entityManagerFactory
Никто из них не отвечает на мой вопрос. Дело в том, что я смог решить проблему, но у меня есть вопрос по этому поводу.
Позвольте мне поделиться своим связанным кодом, а затем задать вопрос, который у меня есть.
@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() {
Я изменил имя medhod на entityManagerFactory следующим образом:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
Создание имени фабричного компонента в контексте, равного «entityManagerFactory», поскольку по умолчанию имя компонента будет равно имени метода, если это не указано явно.
Мой вопрос: есть ли место в JPA API, где "по соглашению" он ищет объект EntityManagerFactory с именем "entityManagerFactory" внутри контейнера Spring? Почему он не работает, если имя метода «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> {
}