2010-10-28 52 views
7

Quiero guardar algunos Objetos en la base de datos con ID predefinidos usando Hibernate. ¿Es posible hacerlo usando el método de guardar de la sesión de Hibernate?Guardar nuevo objeto con Hibernate usando el ID suministrado

Sé que hay soluciones siguientes:

1) ejecutar comandos SQL con instrucciones de inserción necesarias:

insert into MyObj(id,name) values (100,'aaa'), (101,'bbb'); 

2) utilice consulta SQL en Hibernate:

public static boolean createObj(Long id, String name) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    if (session.get(MyObj.class, id) == null) {   
    session.beginTransaction(); 
    SQLQuery sqlQuery = session.createSQLQuery 
     ("insert into myobj(id,name) values(?,?)"); 
    sqlQuery.setLong(0, id); 
    sqlQuery.setString(1, name); 
    sqlQuery.executeUpdate(); 
    session.getTransaction().commit(); 
    return true; 
    } else { 
    return false; 
    } 
} 

Pero: es es posible prescindir de SQLQuery?

En referencia Hibernate en la sección 11.2. Making objects persistent no es ejemplo de código:

Alternativamente, puede asignar el identificador de usando una versión sobrecargada de guardar().

DomesticCat pk = new DomesticCat(); 
pk.setColor(Color.TABBY); 
pk.setSex('F'); 
pk.setName("PK"); 
pk.setKittens(new HashSet()); 
pk.addKitten(fritz); 
sess.save(pk, new Long(1234)); 

Pero no pude encontrar ejemplo de cómo hacer esto.

Entonces, ¿es posible guardar objetos nuevos con los ID suministrados en la base de datos con Hibernate que no utiliza la consulta SQL? Si es así, ¿entonces cómo? Y cómo sobrecargar save() del método de sesión como se menciona en Hibernate reference?

Gracias!

Respuesta

4

La documentación le pide que no anule save usted mismo, pero para usar la variante de save que toma dos argumentos. Vea [JavaDocs] [1] para más detalles.

YourEntity entity = // .. 
entity.setFoo(foo); 
entity.setBar(bar); 
//.. 
session.save(entity, theIDYouWantToUse); 

[1]: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#save(java.lang.String, java.lang.Object)

+1

No se olvide de no utilizar generadores de identificación cuando se utiliza-dos argumentos ' save' –

+1

Eh, el enlace correcto es: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/classic/Session.html#save(java.lang.Object, java.io. Serializable) – iryndin

+2

La única variante de 'Guardar()' que usa dos args toma una cadena y luego el objeto mismo ... no una clave. – Nyerguds

4

Uso session.replicate

YourEntity entity = // .. 
entity.setId(yourId); 
entity.setBar(bar); 
//.. 
session.replicate(entity,ReplicationMode.EXCEPTION); 
1

Especificar assigned como el generador en la columna de la ID.

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id-generator

Tenga en cuenta que para que esto funcione bien, esto ayuda a tener una versión anulable propiedad. Hibernate luego trata los valores de versión 'nula' como no guardados.

<id name="id" type="int"> 
    <generator class="assigned" /> 
</id> 
<version name="version" type="int"> 

public class Person { 
    // ID; assigned, SPEC. 
    public int getId(); 
    public void setId (int id); 
    // Version; NOTE -- must be nullable! 
    public Integer getVersion(); 
    public void setVersion (Integer version); 
} 

Espero que esto ayude.

0

Por ahora replicate(Object object, ReplicationMode replicationMode) parece ser una forma aceptable y preferida. Es posible que desee jugar un poco con los diferentes valores para ReplicationMode que se ajusten a sus necesidades.

Cuestiones relacionadas