web-dev-qa-db-fra.com

Spring JPA: la méthode Save () doit-elle valider les données dans la base de données?

J'utilise Spring data pour mon projet, j'utilise une variable Repository standard qui extends CRUD Repository.

Mon code fonctionne comme prévu. Cependant, lorsque j'appelle repository.save(), la base de données est pas modifiée?

Dois-je également appeler ensuite une commit pour modifier la base de données? Ou la méthode repository.save() devrait-elle modifier automatiquement la base de données?

7
java123999

Lorsque votre application s'exécute, le gestionnaire Entity associé au thread conserve le contrôle des objets ajoutés ou ajoutés. La méthode save () ne fait que cela, c'est une marque qui dit: "cela doit être enregistré dans la base de données".

La base de données DML (insertion, mise à jour, suppression) n'est pas envoyée à la base de données pendant que vous enregistrez des éléments. Elle est effectuée à la fin, juste avant la validation, elle est retardée jusqu'au dernier moment.

Il est possible d'envoyer le DML à la base de données à tout moment en utilisant la méthode flush () d'Entity Manager. En fait, vous pouvez déboguer le journal de la base de données et voir vos requêtes passer, mais ces modifications apportées à la base de données ne seront visibles que dans votre connexion à la base de données. jusqu'à ce que le commit soit émis; commit () est une méthode de la transaction associée à Entity Manager.

Dans certains frameworks tels que le jeu 1.4.x, les validations sont émises une fois que la vue de la réponse est correctement analysée et rendue.

Au revoir, Hans

4
Hans Poo

Si vous configurez comme ça

<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>

Ensuite, toutes les méthodes annotées avec @Transaction vont commencer et valider une transaction si aucune exception n'est levée.

0
Essex Boy