Question

Dans ma mise en œuvre de DAO que je fais Stripersist.getEntityManager().persist(client);, cela ne semble pas retourner des erreurs, mais je ne peux pas trouver les données qu'il persiste.

Mon objet client ressemble à ceci:

@Entity
public class Client implements Serializable
{

    @Id
    @GeneratedValue
    private Integer id;
    @Column
    private String name;

    //accessors etc here
 ...
 }

J'ai une unité de persistance et est la suivante

<persistence-unit name="stripes" transaction-type="RESOURCE_LOCAL">
      <!-- Tell JPA to use Hibernate -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <!--Hibernate settings -->
        <properties>
         <!--Autodetect entity classes -->
            <property name="hibernate.archive.autodetection" value="class"/>
         <!--Automatically create the SQL schema -->
            <property name="hibernate.hbm2ddl.auto" value="create"/>
       <!--Tell Hibernate to use HSQLDB -->
            <property name="hibernate.dialect"
        value="org.hibernate.dialect.DerbyDialect" />
            <property name="hibernate.connection.driver_class"
        value="org.apache.derby.jdbc.ClientDriver" />
       <!--Configure the JDBC database connection-->
            <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/salestracker" />
            <property name="hibernate.connection.username" value="admin"/>
            <property name="hibernate.connection.password" value="admin"/>
            <property name="jdbc.batch_size" value="0"/>
       <!--Configure the connection pool--> 
            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="300"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>
            <property name="hibernate.c3p0.idle_test_period" value="3000"/>
        </properties>
    </persistence-unit>

Comme je le dis, je l'ai mis un point d'arrêt sur le .persist(client);, le client dispose d'un ensemble de name, et a null pour un id (sinon je l'aurais utilisé .merge()), donc je ne suis pas sûr de savoir pourquoi la les données ne sont pas persisté?

Si je regarde la table, CLIENT, il a 0 lignes.

SELECT * FROM ADMIN.CLIENT

Executed successfully in 0.001 s.
Line 1, column 1

Execution finished after 0.001 s, 0 error(s) occurred.

Est-il possible que l'entité est persisté, mais la transaction n'est pas engagée?

Merci

EDIT: Voici quelques informations d'enregistrement

INFO: 09:24:32,002 DEBUG JpaTransactionManager:285 - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@4e65ad52] for JPA transaction
INFO: 09:24:32,002 DEBUG JpaTransactionManager:371 - Creating new transaction with name [com.jameselsey.salestracker.service.ClientService.persistClient]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
INFO: 09:24:32,002 DEBUG JDBCTransaction:82 - begin
INFO: 09:24:32,003 DEBUG ConnectionManager:444 - opening JDBC connection
INFO: 09:24:32,003 DEBUG JDBCTransaction:87 - current autocommit status: true
INFO: 09:24:32,003 DEBUG JDBCTransaction:90 - disabling autocommit
INFO: break
INFO: 09:24:40,960 DEBUG SessionImpl:247 - opened session at timestamp: 12600914809
INFO: 09:24:40,961 DEBUG JDBCTransaction:82 - begin
INFO: 09:24:40,962 DEBUG ConnectionManager:444 - opening JDBC connection
INFO: 09:24:40,965 DEBUG JDBCTransaction:87 - current autocommit status: true
INFO: 09:24:40,966 DEBUG JDBCTransaction:90 - disabling autocommit
INFO: 09:24:40,993 DEBUG AbstractBatcher:585 - opening JDBC connection
INFO: 09:24:40,993 DEBUG DriverManagerConnectionProvider:132 - opening new JDBC connection
INFO: 09:24:40,996 DEBUG DriverManagerConnectionProvider:138 - created connection to: jdbc:derby://localhost:1527/salestracker, Isolation Level: 2
INFO: 09:24:40,997 DEBUG SQL:111 - select next_hi from hibernate_unique_key for read only with rs
INFO: 09:24:41,001 DEBUG SQL:111 - update hibernate_unique_key set next_hi = ? where next_hi = ?
INFO: 09:24:41,006 DEBUG AbstractBatcher:606 - closing JDBC connection (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)
INFO: 09:24:41,007 DEBUG TableHiLoGenerator:87 - new hi value: 0
INFO: 09:24:41,007 DEBUG AbstractSaveEventListener:135 - generated identifier: 1, using strategy: org.hibernate.id.TableHiLoGenerator
INFO: 09:24:41,036 DEBUG JpaTransactionManager:730 - Initiating transaction commit
INFO: 09:24:41,037 DEBUG JpaTransactionManager:451 - Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@4e65ad52]
INFO: 09:24:41,037 DEBUG JDBCTransaction:134 - commit
INFO: 09:24:41,038 DEBUG JDBCTransaction:227 - re-enabling autocommit
INFO: 09:24:41,038 DEBUG JDBCTransaction:147 - committed JDBC Connection
INFO: 09:24:41,039 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
INFO: 09:24:41,039 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
INFO: 09:24:41,047 DEBUG JpaTransactionManager:539 - Not closing pre-bound JPA EntityManager after transaction
INFO: 09:24:41,047 DEBUG ExecutionContext:183 - Transitioning to lifecycle stage ResolutionExecution
INFO: 09:24:41,048 DEBUG HttpCacheInterceptor:183 - Looking for HttpCache on com.jameselsey.salestracker.action.ViewClientAction.save()
INFO: 09:24:41,160 DEBUG ExecutionContext:183 - Transitioning to lifecycle stage RequestComplete
INFO: 09:24:41,161 DEBUG JDBCTransaction:186 - rollback
INFO: 09:24:41,161 DEBUG JDBCTransaction:227 - re-enabling autocommit
INFO: 09:24:41,162 DEBUG JDBCTransaction:197 - rolled back JDBC Connection
INFO: 09:24:41,162 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection
INFO: 09:24:41,162 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
INFO: 09:24:41,163 DEBUG OpenEntityManagerInViewFilter:119 - Closing JPA EntityManager in OpenEntityManagerInViewFilter
INFO: 09:24:41,163 DEBUG EntityManagerFactoryUtils:313 - Closing JPA EntityManager
Était-ce utile?

La solution

citant librement les spécifications Java EE, chaque fois que vous dites em.persist(obj), il ne signifie pas nécessairement une requête SQL directe à la base de données. Cela signifie que l'entité nommée obj aura une identité persistante , donc son état normal sera sauvé et rincée au magasin persistant dans un certain temps, peut-être juste après votre appel persist, peut-être après la transaction, cela dépend votre fournisseur de JPA. Cela pourrait signifier que si vous appelez persist à une entité et une pause l'application avec un point d'arrêt, vos données ne seront pas subsisté immédiatement la base de données.

Si vous souhaitez avoir une requête SQL juste après la persistance d'une entité, vous pouvez exécuter em.flush().

Autres conseils

Avez-vous cela, après avoir appelé persist()?

Stripersist.getEntityManager().getTransaction().commit();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top