Java 无法使用@PersistenceContext获取InjectEntityManager
我试图使用SpringBoot和jpa,使用hibernate作为提供程序,进行基于属性的多数据库配置。我有一个EntityManagerBuilder,它被一个配置类调用。getEntityManagerFactory被客户端类调用Java 无法使用@PersistenceContext获取InjectEntityManager,java,hibernate,spring-boot,jpa,spring-data-jpa,Java,Hibernate,Spring Boot,Jpa,Spring Data Jpa,我试图使用SpringBoot和jpa,使用hibernate作为提供程序,进行基于属性的多数据库配置。我有一个EntityManagerBuilder,它被一个配置类调用。getEntityManagerFactory被客户端类调用 public class EntityManagerBuilder { private static String PACKAGES_TO_SCAN="packagesToScan"; private static String PERSIS
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;
}
}
因此,我每次运行应用程序时都会遇到这个错误
***************************
APPLICATION FAILED TO START
***************************
Description:
**A component required a bean named 'persisted' that could not be found.**
在注入持久性上下文之前,有没有办法配置Springbean。
我想在配置了多个数据源的情况下使用@Transactional。因此,我考虑创建EntityManagerFactorybean,以及它们各自的持久化单元名称,并认为我将获得Dao级别的持久化上下文
我还制作了事务bean:-
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);
}
您没有显示全部代码。这就是为什么很难理解你在做什么。顺便问一下,为什么您要以编程方式配置它,而不是通过配置文件?您必须显示从哪里调用这些静态方法,正如mentalurg所建议的,您应该通过使用配置来使用Bean,即使您希望自定义属性使用@Value
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);
}