2013-04-29 7 views
19

Secondo la mia comprensione in ibernazione (si prega di confermare)hibernate session.save() non riflette nel database

1- Devi session.close() se si ottiene da getSessionFactory().openSession().
2- Non c'è bisogno di session.close() se si ottiene da getSessionFactory().getCurrentSession(). Viene automaticamente chiuso dopo il commit ().

3- @ 2 Quando si utilizza getSessionFactory().getCurrentSession(), dobbiamo eseguire tutte le attività del DB all'interno di una transazione attiva in modo che possiamo commit() alla fine.

4- Hibernate en-code tutti salvare, aggiornare ed eliminare le operazioni e li sottopone al server di database solo dopo un flush() funzionamento o commettere la transazione o chiusura del sessione in cui si verificano tali operazioni. (come da javadoc)

Dai punti di cui sopra se ritengo & , quindi il seguente codice dovrebbe funzionare:

Session session = HibernateUtil.getSessionFactory().openSession(); 
AccountDetails ac = new AccountDetails(); 
//perform set operations 
session.save(ac); 
session.close(); 
System.out.println("new account stored."); 

MA non funziona cioè che gira senza problemi, ma non riflette (negozio) in database.Why questo è così? Quando scrivo il codice all'interno di una transazione e commetto, allora viene memorizzato.

Penso che mi manchi una cosa di base. Si prega di precisare.

+0

Penso che abbiate perso Transactions qui! (o da qualche parte nelle tue configurazioni) vedi il link per guidarti passo per passo http://www.laliluna.de/articles/java-persistence-hibernate/first-hibernate-example-tutorial.html –

+0

Puoi condividere il link javadoc da punto 4? – dcernahoschi

risposta

14

Quando si crea una sessione utilizzando SessionFactory.openSession(), non viene creata alcuna transazione, quindi le operazioni vengono eseguite al di fuori del contesto della transazione. Per vedere le tue modifiche, devi iniziare una nuova transazione, o eseguire le tue operazioni come parte della transazione in corso. Dalla documentazione:

Una tipica transazione dovrebbe utilizzare la seguente forma:

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    //do some work 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 
1

Ogni volta che si eseguire qualsiasi unità di lavoro sugli oggetti di database, transazioni devono essere utilizzati. http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html mostra perché vengono utilizzati e come possono essere utilizzati. Ma la chiave è usare un oggetto transaction chiamando che restituisce un oggetto Transaction. Questo rappresenterà l'unità di lavoro svolta nel database.

5

stavo anche cercando di capire il punto: save() può eseguire l'operazione di inserimento delle transazioni fuori confine così ho fatto qualcosa di simile

SessionFactory factory = new Configuration().configure() 
        .buildSessionFactory(); 
      Session session = factory.openSession(); 

      session.save(user); 

      session.close(); 

Ma i dati non inseriti nel database.Così ho provato di nuovo questo ed ora ha funzionato per me e per i dati inseriti con successo:

nel file di configurazione:

<property name="connection.autocommit">true</property> 

e nel codice Java:

SessionFactory factory = new Configuration().configure() 
      .buildSessionFactory(); 
    Session session = factory.openSession(); 

    session.save(user); 

    session.flush(); 
    session.close(); 
4

session.save non è salvato nel database senza avere la transazione. L'unico modo per farlo è quello di utilizzare il

<property name="connection.autocommit">true</property> 

Se questa proprietà si è utilizzata alcuna transazione bisogno e anche non è necessario session.flush() o session.close()

2

Session.close() è responsabile solo per chiudere la sessione https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#close()

come lavorare con sessione di Hibernate: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics

// Non-managed environment idiom 
Session sess = factory.openSession(); 
Transaction tx = null; 
try { 
    tx = sess.beginTransaction(); 

    // do some work 
    ... 

    tx.commit(); 
} 

catch (RuntimeException e) { 
    if (tx != null) tx.rollback(); 
    throw e; // or display error message 
} 
finally { 
    sess.close(); 
} 

Come scritto nella documentazione: una soluzione molto più flessibile è built-in "sessione corrente" gestione del contesto di Hibernate:

1

ho trovato ho dovuto irrigare e quindi aggiornare la DAO, e poi lavorato.

session.flush() 
session.refresh(entityDAO) 
Problemi correlati