我讀過了,我相信嘗試了所有關於此的帖子,但沒有找到正確答案的運氣。 我正在使用基於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;
}
}
如果你有什麼事能幫助我找到這一個,讓我知道。
如果您正在使用Spring數據JPA(這似乎情況就是這樣),爲什麼你有'LokacijaRepositoryImpl'? – geoand 2014-09-11 14:02:44
我想我雖然這是必須的?我該怎麼做? – Blejzer 2014-09-11 14:17:59
我不敢相信!我刪除了LokacijaRepositoryImpl,並得到這個錯誤:「沒有名爲'entityManagerFactory'的bean被定義」。我查看了文檔,它說使用默認名稱:'entityManagerFactory'。我將方法的名稱從configureEntityManagerFactory更改爲entityManagerFactory,就是這樣! – Blejzer 2014-09-11 14:21:37