2014-09-11 1 views
1

Я читал, что, по-моему, пробовал все сообщения по этому вопросу, но не повезло найти правильный ответ. Я использую конфигурацию на основе 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; 
     } 

    } 

Если вам нужно что-нибудь еще, чтобы помочь мне понять это, дайте мне знать.

+0

Если вы используете Spring Data JPA (который, кажется, если это так), почему у вас есть «LokacijaRepositoryImpl»? – geoand

+0

Я предполагаю, что, хотя это обязательно? Как мне это сделать? – Blejzer

+0

Не могу поверить !!! Я удалил LokacijaRepositoryImpl и получил эту ошибку: «Нет bean с именем« entityManagerFactory »определено». Я просмотрел документацию, и он говорит, что использует имя по умолчанию: «entityManagerFactory». Я изменил имя метода от configureEntityManagerFactory до entityManagerFactory, и это было! – Blejzer

ответ

2

Проблема заключается в том, что вы пытаетесь создать реализацию LokacijaRepositoryLokacijaRepositoryImpl), в то время как Spring Data JPA (который вы настроили) пытается сделать то же самое.

Что вам нужно сделать, это:

  1. полностью удалить LokacijaRepositoryImpl
  2. Либо изменить configureEntityManagerFactory к entityManagerFactoryили добавить entityManagerFactoryRef=configureEntityManagerFactory к @EnableJpaRepositories
+0

Это именно то, что я сделал. Удалили реализацию репозитория и переименовали configureEntityManagerFactory в entityManagerFactory, и он работал как шарм! Я не тестировал его добавление, но позже могу. – Blejzer

+0

@Blejzer Nice !! – geoand