Ich verwende Spring data
für mein Projekt, ich verwende einen Standard Repository
, der extends CRUD Repository
.
Mein Code funktioniert wie erwartet, aber wenn ich repository.save()
aufrufe, wird die Datenbank nicht geändert?
Muss ich danach auch ein commit
aufrufen, um die Datenbank zu ändern? Oder sollte die Methode repository.save()
die Datenbank automatisch ändern?
Wenn Ihre Anwendung ausgeführt wird, behält der Entity Manager, der dem Thread zugeordnet ist, die Kontrolle über geänderte oder hinzugefügte Objekte. Die save () -Methode macht dies einfach. Dies ist eine Markierung, die besagt: "Dies sollte in der Datenbank gespeichert werden".
Die Datenbank-DML (Einfügen, Aktualisieren, Löschen) wird beim Speichern nicht an die Datenbank gesendet. Sie wird am Ende kurz vor dem Festschreiben ausgeführt und ist bis zum letzten Moment verzögert.
Es ist möglich, die DML zu jeder Zeit mit der flush () - Methode von Entity Manager an die Datenbank zu senden. Tatsächlich können Sie das Datenbankprotokoll debuggen und Ihre Abfragen durchlaufen sehen. Diese Änderungen an der Datenbank sind jedoch nur in Ihrer DB-Verbindung sichtbar bis das Commit ausgegeben wird; commit () ist eine Methode der Transaktion, die dem Entity Manager zugeordnet ist.
In einigen Frameworks wie play 1.4.x werden die Commits ausgegeben, nachdem die Antwortansicht korrekt analysiert und gerendert wurde.
Tschüss, Hans
Wenn du so konfigurierst
<tx:annotation-driven />
<jpa:repositories base-package="com.greg" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.greg" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Dann werden alle mit @Transaction annotierten Methoden gestartet und eine Transaktion festgeschrieben, wenn keine Ausnahme ausgelöst wird.