2014-08-29 13 views
32

A causa di uno scopo, ho bisogno di ottenere un id di un oggetto subito dopo l'inserimento. Posso lavorare in giro con questo codice:ibernazione - ottiene l'id dopo l'oggetto di salvataggio

session.save(Object o) // insert to database 
findByPorperty(o.property) // Return the inserted object along with the id 

penso che il codice di cui sopra non è sufficiente perché la sessione ha bisogno di riaprire per trovare l'oggetto. Quindi:

  1. C'è un modo migliore per ottenere l'ID?
  2. Se esiste, posso applicare la stessa strategia per ottenere un elenco di ID dopo aver inserito un sacchetto di oggetti?
+0

meno che non si chiude la sessione, è possibile ottenere l'oggetto attraverso il suo id, è ancora lì in sessione, e lo estrarrà da Sesison. –

+0

Posso farlo. Ma continuo a pensare che il supporto in ibernazione recuperi l'id dopo l'inserimento. –

+0

no, genererà l'id e l'oggetto sarà in sessione, sam etransaction sarà in grado di recuperarlo, provare almeno, vedere se si ottengono problemi –

risposta

51

Il session.save(object) restituisce l'id dell'oggetto o in alternativa è possibile chiamare il metodo getter id dopo aver eseguito un salvataggio.

Save() Valore restituito:

Serializable save(Object object) throws HibernateException 

Returns: metodo

the generated identifier 

Getter esempio:

UserDetails entità:

@Entity 
public class UserDetails { 
    @Id 
    @GeneratedValue 
    private int id; 
    private String name; 

    // Constructor, Setters & Getters 
} 

logica per testare i id:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
session.getTransaction().begin(); 
UserDetails user1 = new UserDetails("user1"); 
UserDetails user2 = new UserDetails("user2"); 

//int userId = (Integer) session.save(user1); // if you want to save the id to some variable 

System.out.println("before save : user id's = "+user1.getId() + " , " + user2.getId()); 

session.save(user1); 
session.save(user2); 

System.out.println("after save : user id's = "+user1.getId() + " , " + user2.getId()); 

session.getTransaction().commit(); 

uscita di questo codice:

prima di salvare: ID utente di = 0, 0

dopo il salvataggio: user id's = 1, 2

Come per questa uscita, si può vedere che le ID non sono stati fissati prima di salvare l'entità UserDetails, una volta che si salvano le entità poi Hibernate fissati è la id per gli oggetti - user1 e user2

+0

Quindi sarebbe object.setId ((int) save (oggetto oggetto))? –

+2

Hibernate stesso imposta l'id per te, non devi fare nulla per questo. Ho aggiunto un piccolo esempio nella mia risposta, è possibile vedere la differenza prima e dopo 'session.save (oggetto)' – Chaitanya

6

Diciamo che la vostra chiave primaria è un Il numero intero e l'oggetto che si salva è "ticket", quindi è possibile ottenerlo in questo modo. Quando si salva l'oggetto, id viene sempre restituito

Integer id = (Integer)session.save(ticket); 
+2

Usando questo mio IDE si lamenta:'Tipo Mancata corrispondenza: Tipo mancata corrispondenza: impossibile convertire da Serializable a Integer'. Devi eseguire il cast su intero: Integer id = (Integer) session.save (ticket); ' – EliteRaceElephant

1

o in un modo migliore che possiamo avere in questo modo

Diciamo che la vostra chiave primaria è un numero intero e l'oggetto si salva è "biglietto", allora si può farlo in questo modo Quando si salva l'oggetto, l'ID viene sempre restituito

// l'unboxing si verifica qui in modo che l'ID qui sia il tipo di valore e non il tipo di riferimento. Ora puoi verificare l'ID per 0 in caso di errore di salvataggio. come di seguito:

int id = (Integer) session.save(ticket); 
if(id==0) 
    your session.save call was not success. 
else ' 
    your call to session.save was successful. 
0

Per impostazione predefinita, ibernazione quadro tornerà immediatamente id, quando si sta cercando di salvare l'entità utilizzando Save(entity) metodo.Non c'è bisogno di farlo esplicitamente.

Nel caso in cui la chiave primaria è int è possibile utilizzare sottostante Codice:

int id=(Integer) session.save(entity); 

In caso di utilizzo stringa sottostante Codice:

String str=(String)session.save(entity); 
Problemi correlati