2011-07-22 7 views
7

Tengo un object A que mapea a table A en el PPactualizar un campo de un objeto en hibernación

class A { 
    Integer id; 
    String field2,field2;field3 ,... fieldN; 
    //lots of other attribute 
} 

ahora quiero escribir una API DAO que simplemente actualiza un enfoque único field.One es que puedo primera cargar el objeto a continuación, cambia el atributo que necesito y luego utilizar la combinación de API

//start transcation 
A a = session.load(A.class, id); 
A.setfieldP(newValue) 
session.merge(A) 
//commit transcation 

Ahora si uso siguiente código

//start transcation 
A a = new A(); 
a.setId(id); //set a id by which object A exists in DB 
A.setfieldP(newValue) 
session.merge(A) 
//commit transaction 
01 Ahora

segundo enfoque todos los campos excepto el ID y fieldP se establecen en NULL

1) Ahora hay otro enfoque?
2) ¿Puedo usar la actualización en lugar de combinar?

Respuesta

2

Por lo general prefieren session.get vs Session.load, como session.get will return null en contraposición a lanzar una excepción, pero depende de la conducta que desea.

la carga del objeto, estableciendo su campo, y llamar a cualquiera

session.merge(myObject) 

es la manera estándar, aunque también se puede utilizar

session.saveOrUpdate(myObject) 

siempre y cuando el objeto no ha sido extraído, que en tu caso, no habrá sido separado. Here is a good article explicando las diferencias en merge y saveOrUpdate.

En el segundo ejemplo, ¿está editando la clave principal del objeto? En general, esta es una mala forma, debe eliminar e insertar en lugar de cambiar la clave principal.

+0

Probablemente ya lo sepa, pero saveOrUpdate funciona con objetos separados. La única vez que tiene problemas es cuando hay un objeto existente con la misma identificación adjunta a la sesión. –

+0

'saveOrUpdate' actualizará los valores a un objeto existente en el db (+1) – bluefoot

+0

@Russ Sanwald: En el segundo enfoque lo que intento hacer es, quiero actualizar un objeto. Ahora, para actualizarlo, no quiero buscarlo desde db y luego actualizar, en su lugar estoy creando un nuevo Objeto A, establezco su clave principal y el campoN y luego actualizo. Configuré la clave principal porque quiero actualizar el objeto con primarykey = X (asumiendo que el objeto con id x ya está presente en DB y establezco fieldN como quiero actualizarlo.No estoy cambiando la clave principal, pero mi propósito es chnage valor de campoN del objeto A con ID = X – akshay

13

Si necesita actualizar un montón de entidades a la vez la forma más eficaz es utilizar una consulta:

Query query = session.createQuery("update EntityName set fieldP = 'newValue' " 
     + "where id IN (75, 76)"); 
query.executeUpdate(); 

Esto le permite cambiar los valores de campo sin cargar la entidad o entidades en la memoria.

Lo mejor es utilizar consultas con nombre y parámetros con nombre: la implementación anterior es solo un ejemplo.

+0

esto se puede considerar oftálico a esta pregunta. – bluefoot

+6

No estoy de acuerdo. En primer lugar, pidió un enfoque diferente si hubiera uno. En segundo lugar, a partir de su segundo fragmento de código está claro que quiere evitar cargar la entidad en la memoria. –

0

Una optimización más aquí podría ser el uso de la actualización dinámica establecida en true para la entidad. Esto asegurará que cada vez que haya una actualización, solo los campos cambiados solo se actualicen.

+0

es necesario para ir a buscar el objeto en primer lugar de db y luego update.What si una instancia de un nuevo objeto con id X y después fijar sólo rellene los campos Quiero actualizar? En mi enfoque 2 todos los demás campos que no están ajustados se guardan como nulos, quiero que preserve los viejos valores no nulos – akshay

2

Utilizando JPA puede hacerlo de esta manera.

CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class); 
Root<User> root = criteria.from(User.class); 
criteria.set(root.get("fname"), user.getName()); 
criteria.set(root.get("lname"), user.getlastName()); 
criteria.where(builder.equal(root.get("id"), user.getId())); 
session.createQuery(criteria).executeUpdate(); 
Cuestiones relacionadas