Я пытался создать конфигурацию базы данных на основе свойств, используя Spring Boot и Jpa, используя Hibernate в качестве поставщика.У меня был этот EntityManagerBuider, который вызывался из класса конфигурации. getEntityManagerFactory вызывался из класса клиента.
public class EntityManagerBuilder {
private static String PACKAGES_TO_SCAN="packagesToScan";
private static String PERSISTANT_UNIT_NAME="persistence.unit.name";
private static String HIBERNATE_DIALECT_CONSTANT="hibernate.dialect";
private static String HIBERNATE_DIALECT_DEFAULT_VALUE="org.hibernate.dialect.MySQL";
private static String HIBERNATE_HBM2DDL_CONSTANT="hibernate.hbm2ddl.auto";
private static String HIBERNATE_HBM2DDL_DEFAULT_VALUE="none";
private static Logger logger= LoggerFactory.getLogger(EntityManagerBuilder.class);
public EntityManagerBuilder(){
}
public static EntityManager getEntityManager(EntityManagerFactory entityManagerFactory){
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
=new LocalContainerEntityManagerFactoryBean();
return entityManagerFactory.createEntityManager();
}
public static EntityManagerFactory getEntityManagerFactory(DataSource dataSource,
Map<String,String> jpaProperties,
Map<String,String> jpaEntityInfo,
String transaction,
ConfigurableBeanFactory configurableBeanFactory){
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
=new LocalContainerEntityManagerFactoryBean();
Properties properties=new Properties();
properties.putAll(jpaProperties);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(getVendorAdaptor());
if(jpaEntityInfo==null || jpaEntityInfo.get(PACKAGES_TO_SCAN)==null){
throw new IllegalArgumentException("Packages to scan required in jpa configuration ");
}
if(jpaProperties.get(HIBERNATE_DIALECT_CONSTANT)==null){
logger.warn("Hibernate dialect not set choosing default as null");
jpaProperties.put(HIBERNATE_DIALECT_CONSTANT, HIBERNATE_DIALECT_DEFAULT_VALUE);
}
if(jpaProperties.get(HIBERNATE_HBM2DDL_CONSTANT)==null){
logger.warn("Hibernate HB2DDL not set choosing mysql as default");
jpaProperties.put(HIBERNATE_HBM2DDL_CONSTANT, HIBERNATE_HBM2DDL_DEFAULT_VALUE);
}
localContainerEntityManagerFactoryBean.setPackagesToScan(jpaEntityInfo.get(PACKAGES_TO_SCAN));
localContainerEntityManagerFactoryBean.setPersistenceUnitName("perisisted");
localContainerEntityManagerFactoryBean.setJpaProperties(properties);
localContainerEntityManagerFactoryBean.setDataSource(dataSource);
localContainerEntityManagerFactoryBean.afterPropertiesSet();
//registering spring bean object
configurableBeanFactory.registerSingleton(transaction, localContainerEntityManagerFactoryBean.getObject());
return localContainerEntityManagerFactoryBean.getObject();
}
private static HibernateJpaVendorAdapter getVendorAdaptor() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.MYSQL);
vendorAdapter.setShowSql(true);
return vendorAdapter;
}
}
Проблема, с которой я столкнулся, заключается в том, что я не могу ввестиДиспетчер сущностей из контекста постоянства. Бобы весны не настроены к моменту введения контекста постоянства.Конфигурационный код контейнера Spring никогда не выполняется, вместо этого он начинает внедрять контекст персистентности контекста jpa до контекста Spring.
@Repository
public class BooksDao {
@Autowired
private EntityManageModuleAware entityManageModuleAware;
@PersistenceContext(unitName = "persisted")
private EntityManager entityManager;
private ApplicationContext applicationContext;
}
И, таким образом, я сталкиваюсь с этой ошибкой каждый раз, когда я запускаю приложение
***************************
APPLICATION FAILED TO START
***************************
Description:
**A component required a bean named 'persisted' that could not be found.**
Есть ли способ конфигурирования пружинных бинов до того, как контекст персистентности будет введен .Я хочу использовать @Transactional с несколькими настроенными источниками данных.Мысль о создании компонентов управления объектами с соответствующими именами модулей персистентности и думали, что я получу контекст персистентности на уровне Дао.
Я также сделал транзакционные бины: -
public static void setTransactionBean(EntityManagerFactory entityManagerFactory , DataSource dataSource,
String transactionName){
JpaTransactionManager jpaTransactionManager=new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
jpaTransactionManager.setDataSource(dataSource);
ConfigurableBeanFactory configurableBeanFactory=(ConfigurableBeanFactory)beanFactoryStatic;
configurableBeanFactory.registerSingleton(transactionName, jpaTransactionManager);
}