2014-09-11 57 views
1

我讀過了,我相信嘗試了所有關於此的帖子,但沒有找到正確答案的運氣。 我正在使用基於Java的配置和我的spring mvc項目,並且想要嘗試使用Spring CrudRepository來擺脫DAO,那就是當整個地獄崩潰時: 在刷新後以「無事務正在進行」開始: - 嘗試在方法中添加@Transactional - 這裏找不到任何變體可用 - 嘗試更改配置,但由於它是基於java的,因此大多數答案都是基於xml的。沒有運氣。 因此,最後我不得不問:基於Java的配置的Spring Data CrudRepository - EntityManager - 沒有事務正在進行

如何配置我的項目,使CrudRepository堅持,或如何使用Java配置創建Spring EntityManager。

這是我的配置文件的最新版本:

@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數據JPA(這似乎情況就是這樣),爲什麼你有'LokacijaRepositoryImpl'? – geoand 2014-09-11 14:02:44

+0

我想我雖然這是必須的?我該怎麼做? – Blejzer 2014-09-11 14:17:59

+0

我不敢相信!我刪除了LokacijaRepositoryImpl,並得到這個錯誤:「沒有名爲'entityManagerFactory'的bean被定義」。我查看了文檔,它說使用默認名稱:'entityManagerFactory'。我將方法的名稱從configureEntityManagerFactory更改爲entityManagerFactory,就是這樣! – Blejzer 2014-09-11 14:21:37

回答

2

問題是,您正試圖創建一個LokacijaRepository(在LokacijaRepositoryImpl)的實現,而Spring Data JPA(您已配置)試圖做同樣的事情。

你需要做的是:

  1. 完全刪除LokacijaRepositoryImpl
  2. 要麼改變configureEntityManagerFactoryentityManagerFactory添加entityManagerFactoryRef=configureEntityManagerFactory@EnableJpaRepositories
+0

這正是我所做的。刪除了存儲庫的實現,並將configureEntityManagerFactory重命名爲entityManagerFactory,它的工作方式就像一個魅力!我還沒有測試添加它,但我可能會稍後。 – Blejzer 2014-09-11 21:53:33

+0

@Blejzer尼斯! – geoand 2014-09-11 22:10:44