2012-10-27 16 views
6

Sto usando Hibernate 4.1.7 e sto provando ad aggiornare l'oggetto, ma non c'è documentazione su come dovrebbe essere fatto. Attualmente, sto facendo questo:Aggiornamento di ibernazione con EntityManager

Person person = personDao.getPersonById(1); 
    person.setAge(23); 
    person.setLastname("McName"); 
    person = personDao.update(person); 

Nell'aggiornamento PersonDao assomiglia a:

public Person update(Person person) { 
     return entityManager.merge(person); 
    } 

In PersonDao getPersonById è:

public Person getPersonById(int id) { 
     personQuery = entityManager.createNamedQuery("Person.findPerson", Person.class); 
     personQuery.setParameter("id", id); 
     return personQuery.getSingleResult(); 
    } 

anche io ho definito query denominata dentro classe persona ed è qui:

@NamedQuery(name="Person.findPerson", query="SELECT p FROM Person p WHERE p.id = :id") 

Usando che la mia persona non sarà aggiornata, come dovrei implementare l'aggiornamento usando la sospensione?

+0

Il codice di cui sopra è OK, tranne che la chiamata a 'personDao.update()' è completamente inutile se tutto viene eseguito in una singola transazione: lo stato di un'entità viene effettuata automaticamente persistente da JPA/Hibernate a la fine della transazione. Il metodo getPersonById potrebbe anche essere ridotto a 'em.find (Person.class, id)', che sarebbe più semplice e più efficiente, dal momento che non eseguirà alcuna query se l'entità è già stata caricata. –

+0

Addendum: questo è sicuramente spiegato nella documentazione. Vedi http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e772 –

risposta

4

Due scenari potrebbero apparire per te.

È possibile modificare una proprietà dell'oggetto e solo quella proprietà.

Se questo è il caso, si desidera utilizzare il metodo: find, modify, flush, commit.

em.find(Person.class, person.getId()) 
person.setStatus("ACTIVE"); 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 

È possibile utilizzare le proprietà dell'oggetto per aggiornare l'elemento.

Se questo è il caso, si desidera utilizzare il metodo: unione, modifica facoltativa, flush, commit.

em.merge(person); 
//modify person if you wish. 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 
+0

Trovato la mia soluzione, finalmente ho usato entityManager.getTrasaction(). Begin(); person = entityManager.find (Person.class, id); entityManager.merge (persona); // modifica dati persona entityManager.getTransaction(). Commit(); – Timo

+0

Felice di aver trovato una soluzione. Se l'id utilizzato durante la ricerca (Person.class, id) è il person.id utilizzato quando si esegue l'unione (persona), quindi l'unione potrebbe non essere necessaria. Una volta eseguita la ricerca, la tua entità viene gestita e puoi modificare e confermare le tue modifiche. – dseibert

0

Non so quello che stai chiedendo esattamente, ma nel metodo, Person.getPersonById(int id), è possibile semplificare il codice con il seguente:

return entityManager.find(Person.class, id); 
1

Hibernate e JPA anche altre implementazioni gestire automaticamente lo stato di entità e salvarlo nel database se la modifica è inclusa nella transazione. Non è necessario chiamare esplicitamente i metodi merge o update.

Se si utilizza le transazioni di risorse locali (non gestiti dal gestore delle transazioni JTA) provare qualcosa di simile:

EntityTransaction tx = entityManager.getTransaction(); 
tx.begin(); 
Person person = personDao.getPersonById(1); 
person.setAge(23); 
person.setLastname("McName"); 
tx.commit(); 

e tutte le modifiche verranno salvati automaticamente nel database.

Se si utilizza JTA, è necessario contrassegnare i limiti della transazione in un altro modo, ad esempio utilizzando l'annotazione Spring AOP @Transactional.

+0

Sto usando hsqldb (resource-local) e usando questo codice ottengo eccezione: org.hibernate. PersistentObjectException: entità separata passata a persist: com.application.model.Person – Timo

+0

Probabilmente si stanno utilizzando due istanze distinte di EntityManager. – Jarek

Problemi correlati