Я читал, что, по-моему, пробовал все сообщения по этому вопросу, но не повезло найти правильный ответ. Я использую конфигурацию на основе java с моим проектом mvc spring, и хотел попробовать Spring CrudRepository, чтобы уйти от DAO, и вот когда весь ад сломался: началось с того, что «никакая транзакция не выполняется» на флеше после сохранения : - попробовал добавить @Transactional к методу - ни одна из найденных здесь вариаций - попробовала изменить конфигурацию, но поскольку она основана на java, большинство ответов основаны на xml. не повезло. Так что, наконец, я должен спросить:Данные Spring CrudRepository на основе java-конфигурации - EntityManager - транзакция не выполняется
Как настроить мой проект на сохранение CrudRepository или создание Spring EntityManager с использованием конфигурации java.
Это последняя версия моего файла конфигурации:
@Configuration
@ComponentScan(basePackages = { "ba.fit.vms" })
@ImportResource(value = "classpath:spring-security-context.xml")
@EnableTransactionManagement
@EnableJpaRepositories
public class AppConfig {
@Bean
public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setLocation(new ClassPathResource("/persistence.properties"));
return ppc;
}
// Security Configuration
@Bean
public KorisnickiServis korisnickiServis(){
return new KorisnickiServis();
}
@Bean
public TokenBasedRememberMeServices rememberMeServices() {
return new TokenBasedRememberMeServices("remember-me-key", korisnickiServis());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new StandardPasswordEncoder();
}
// Jpa Configuration
@Value("${dataSource.driverClassName}")
private String driver;
@Value("${dataSource.url}")
private String url;
@Value("${dataSource.username}")
private String username;
@Value("${dataSource.password}")
private String password;
@Value("${hibernate.dialect}")
private String dialect;
@Value("${hibernate.hbm2ddl.auto}")
private String hbm2ddlAuto;
@Bean
public DataSource configureDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(configureDataSource());
entityManagerFactoryBean.setPackagesToScan("ba.fit.vms");
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
Properties jpaProperties = new Properties();
jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, dialect);
jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, hbm2ddlAuto);
//jpaProperties.put(org.hibernate.cfg.Environment.SHOW_SQL, true);
entityManagerFactoryBean.setJpaProperties(jpaProperties);
return entityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager transactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(configureEntityManagerFactory().getObject());
return transactionManager;
}
}
Я пробовал несколько вариантов, но всегда получать такой же «сделка не находится в процессе» ошибка. Кроме того, только проблеск в репозиториях: LokacijaRepository:
@Transactional
public interface LokacijaRepository extends CrudRepository<Lokacija, Long> {
}
И LokacijaRepositoryImpl:
@Repository
public class LokacijaRepositoryImpl implements LokacijaRepository {
protected static Logger logger = Logger.getLogger("repo");
@PersistenceContext // tried this as well(type= PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@Override
@Transactional// tried number of variations here as well, like REQUIRED...
public <S extends Lokacija> S save(S entity) {
logger.debug("trying to save!");
try {
entityManager.persist(entity);
entityManager.flush();
return entity;
} catch (Exception e) {
logger.debug("error: "+ e.toString());
return null;
}
}
Если вам нужно что-нибудь еще, чтобы помочь мне понять это, дайте мне знать.
Если вы используете Spring Data JPA (который, кажется, если это так), почему у вас есть «LokacijaRepositoryImpl»? – geoand
Я предполагаю, что, хотя это обязательно? Как мне это сделать? – Blejzer
Не могу поверить !!! Я удалил LokacijaRepositoryImpl и получил эту ошибку: «Нет bean с именем« entityManagerFactory »определено». Я просмотрел документацию, и он говорит, что использует имя по умолчанию: «entityManagerFactory». Я изменил имя метода от configureEntityManagerFactory до entityManagerFactory, и это было! – Blejzer