Persistenten JPA-Entity mit CrudRepository
Haben Sie Probleme mit dem speichern von JPA Entity durch CrudRepository. Es scheint wieder die ursprüngliche Objekt, das übergeben wurde, um es ohne speichern des Objekts in der Datenbank. Ich weiß, das ist nicht der richtige Weg, es zu tun, aber für Testzwecke, wenn ich eine Instanz von TransactionSynchronizationManager vor dem speichern, scheint es fortbestehen richtig. Dies führt mich zu denken, vielleicht ist es ein Problem der Transaction Manager?
Zusätzlich, wenn ich verwerfen Sie das repository und die Entity-Manager - (em) bekomme ich das gleiche Ergebnis, jedoch wenn ich den Anruf em.flush(), bekomme ich die Exception "Transactionrequiredexception, No Transaction in Progress".
@Transactional
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Autowired
private EntityManagerFactory emf;
@Override
@Transactional(readOnly=false)
public User save(User user) {
// EntityManager em = emf.createEntityManager();
//Object persists when adding following line
// TransactionSynchronizationManager.bindResource(emf , new EntityManagerHolder(em));
return userRepository.save(user);
}
}
@ComponentScan(basePackages = {"..."})
@Import(value={DataContextConfig.class,SecurityConfig.class})
public class AppConfig{
}
@Configuration
@ComponentScan(basePackages = {".."})
@Import(DataConfig.class)
public class DataContextConfig {
}
@Configuration
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableJpaRepositories(value={"com.repository"}, entityManagerFactoryRef="entityManagerFactory", transactionManagerRef="transactionManager")
@PropertySource("classpath:data.properties")
public class DataConfig {
...
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory((EntityManagerFactory) entityManagerFactory());
return txManager;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("...");
factory.setJpaPropertyMap(jpaProperties());
factory.setDataSource(dbSource());
return factory;
}
@Bean
public DriverManagerDataSource dbSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
driverManagerDataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
driverManagerDataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
driverManagerDataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return driverManagerDataSource;
}
}
Hochgeladen habe ich ein kleines Projekt, dass Isolate die Ausnahme. Zip, und führen Sie AccountTester.class http://www14.zippyshare.com/v/81636273/file.html
- Sie lassen sich nicht öffnen-Sitzung, bevor Sie
save
. hast du? - Sehr hilfreich, wenn man die volle stack-trace.
- Es gibt keinen Stacktrace. Nicht ohne Fehler
- Ich denke, Sie versuchen zu
userRepository.save(user);
ohne öffnen Hibernate-session und trnsaction das ist zumindest der Grund, warum Sie immer "No Transaction in Progress" - Fehler. - Ich habe die @EnableTransactionManagement(mode=AdviceMode.ASPECTJ) Anmerkungen in der @Config-Klasse.
- siehe post aktualisieren
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie pro Ihre Probe-Projekt.
Unten sind nur die Klassen geändert, um zu vermeiden, dass Ihre
TransactionRequiredException: no transaction is in progress
problem und erfolgreich legen Sie ein Konto:Original-Referenz
Müssen Sie markieren Spring-Data-JPA-repository mit
@Repository
(Nicht der service). Siehe hierOriginal-Referenz
Beachten Sie die änderungen zu entfernen
@Repository
aus dem Dienst (muss auf Ihrem Spring Data JPA-repository-Schnittstelle) und mit denaccountRepository
zu bestehen Ihrer Organisation in Ihremsave(...)
Methode.Nicht sicher, warum Sie versuchen, verwenden Sie die
EntityManagerFactory
zum erstellen einer neuenEntityManager
(wenn Sie wirklich brauchen einEntityManager
Fall sollten Sie nur injizieren, die konfiguriertEntityManager
, nicht die Fabrik). Das ist übrigens auch der Grund für IhreTransactionRequiredException
.Anyhoo, warum die Mühe mit allem, wenn Sie können, verwenden Sie einfach das repository zu bestehen Ihrer Einheit.
Läuft Ihre
AccountTester
jetzt erzeugt die gewünschte Funktionalität:Es stellt sich heraus, es waren mehrere @EnableTransactionManagement(mode=AdviceMode.ASPECTJ) Anmerkungen innerhalb der Anwendung. Dies war die Ursache des Problems, nach dem entfernen der innerhalb der Neo4j @Configuration-Klasse das problem ging Weg.