Cannot invoke "javax.persistence.EntityManager.persist(Object)" because "this.entityManager" is null
Задача:
Сделать простое CRUD приложение добавление/удаление пользователя (через EntityManager
), без использования SpringBoot. Сделал, работает, но создание EntityManager
работает только вручную через persistence.xml
, из за чего получается громоздкий код, по хорошему нужно делать через аннотацию @PersistenceContext
private EntityManager entityManager;
, но таким образом у меня всегда вылетает ошибка
Cannot invoke "javax.persistence.EntityManager.persist(Object)" because "this.entityManager" is null
может кто сталкивался? прикладываю конфиг файл
@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
@ComponentScan(value = "web")
public class AppConfig {
@Autowired
private Environment env;
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.url"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(getDataSource());
em.setPackagesToScan("web.model");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
Properties props = new Properties();
props.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
props.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
em.setJpaProperties(props);
return em;
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
}
и так же DAO c методом добавления юзера, на котором все и начинает сыпаться
@Repository
public class UserDaoImpl implements UserDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void addUser(User user) {
entityManager.persist(user);
}
}
и рабочий вариант DAO с созданием EntityManager вручную
@Repository
public class UserDaoImpl implements UserDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void addUser(User user) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("JPA");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(user);
entityManager.getTransaction().commit();
entityManager.close();
entityManager.persist(user);
}