2017-06-12 4 views
1

Ich habe eine grundlegende SpringBoot App. mit Spring Initializer, eingebettet Tomcat, Thymeleaf Template-Engine, und Paket als eine ausführbare JAR-DateiSpring @Transactional schreibgeschützt

Mit dieser Abhängigkeit

<dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency> 

ich diesen Dienst erstellt haben als schreibgeschützt deklariert:

@Service 
@Transactional(readOnly = true) 
public class TimeLapseService { 

    @Autowired 
    TimeLapseRepository timeLapseRepository; 

    public Set<TimeLapse> findAllByCompanyId(long companyId) { 
     return timeLapseRepository.findAllByCompanyId(companyId); 
    } 

    public Iterable<TimeLapse> findAll (User user) { 

     if (user.isAdmin()) { 
      return timeLapseRepository.findAll(); 
     } else { 
      return timeLapseRepository.findAllByCompanyId(user.getCompany().getId()); 
     } 

    } 

    public void createTimeLapse (TimeLapse timeLapse) { 
     timeLapseRepository.save (timeLapse); 
    } 

} 

und

public interface TimeLapseRepository extends CrudRepository<TimeLapse, Long> { 
.... 
} 

Soweit ich weiß, da der Service als rea erklärt wird Donly, einen neuen Dienst zu schaffen, nichts zu der DB bestehen sollte, aber es eine Zeile in der Tabelle erstellt

timeLapseService.createTimeLapse(timeLapse24h); 

JPA Eigenschaften:

spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_ON_EXIT=FALSE 
spring.datasource.username=sa 
spring.datasource.password= 
spring.jpa.show-sql=true 
spring.jpa.properties.hibernate.format_sql=true 
hibernate.dialect=org.hibernate.dialect.H2Dialect 
+0

beibehalten werden würde Wie sind Sie sicher, dass Sie eine haben Neuer Datensatz, sehen Sie ihn in einer anderen Transaktion (zB von Ihrem DB-Client)? Fügen Sie auch die jpa-Konfigurationen hinzu, die Sie haben. – GabiM

+0

Kann auf Methodenebene sein und die Transaktion auf Klassenebene überschreiben. –

+0

warum Sie nicht versuchen, die nur lesbar für Ihre speichern Methode wie diese – Pradeep

Antwort

5

Bohnen rufen eine Transaktions = read-only Bean1, das eine Suche durchführt und aufruft, ist transactional = read-write Bean2, das ein neues Objekt speichert.

> Bean1 starts a read-only tx. 31 09:39:44.199 [pool-1-thread-1] DEBUG 
> o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name 
> [nz.co.vodafone.wcim.business.Bean1.startSomething]: 
> PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 

> 
> Bean 2 pariticipates in it. 31 09:39:44.230 [pool-1-thread-1] DEBUG 
> o.s.orm.jpa.JpaTransactionManager - Participating in existing 
> transaction 
> 

Nichts wird in die Datenbank übernommen.

Jetzt Bean2 @Transactional Anmerkung ändern Ausbreitung = Propagation.REQUIRES_NEW

> Bean1 starts a read-only tx. 31 09:31:36.418 [pool-1-thread-1] DEBUG 
> o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name 
> [nz.co.vodafone.wcim.business.Bean1.startSomething]: 
> PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
> 
> Bean2 starts a new read-write tx 31 09:31:36.449 [pool-1-thread-1] 
> DEBUG o.s.orm.jpa.JpaTransactionManager - Suspending current 
> transaction, creating new transaction with name 

hinzufügen Wenn Sie nicht wie machen darunter

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public void createTimeLapse (TimeLapse timeLapse) 
    { 
    timeLapseRepository.save (timeLapse); 
    } 
Verwandte Themen