wake-up-neo.net

Spring JPA: Soll die Save () - Methode Daten in die Datenbank schreiben?

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?

7
java123999

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

4
Hans Poo

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.

0
Essex Boy