2011-06-01 6 views
8

I tienen un simple asociación OneToMany entre 2 objeto de Padres & Niño como se muestra a continuación.Id no ser ajustado al llamar EntityManager.merge()

Entidad Dominante

@Entity 
    public class Parent { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    @Version 
    private Long version; 

     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
     List<Child> children = new ArrayList<Child>(); 

     .... 
    } 

entidad secundaria

@Entity 
    public class Child { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 
     private String name; 
     @Version 
     private Long version; 
     ... 
    } 

que sigue es mi prueba de que carga una matriz existente agrega un niño y llama EntityManager.merge() en la matriz.

@Test 
public void testParent(){ 
    Parent parent = (Parent) dao.loadParent(Parent.class, parentId); 

    Child c = new Child(); 
    c.setName("c"); 

    parent.getChildren().add(c); 

    dao.mergeEntity(parent); 

    Assert.assertNotNull(c.getId()); 
} 

La afirmación donde se prueba la clave principal de la identificación falla. Veo que el registro se está insertando correctamente en la base de datos junto con la clave principal auto asignada.

Todas mis llamadas DAO se envuelven alrededor de transacción con la propagación según sea necesario.

+0

Se debe dar más información, es una aplicación de esta primavera o EJB? .. ¿Podría –

+0

publicar el código de dao.mergeEntity (parent)? – Sylar

+0

Las transacciones son manejadas por Spring siguiente es mi código DAO @Transactional (propagation = Propagation.REQUIRED) \t público mergeEntity (Object entity) { \t \t return em.merge (entidad); \t} – Rakesh

Respuesta

12

EntityManager.merge(..) obtiene una instancia y devuelve una instancia que se gestiona. Y en caso de casos transitorios que devuelve una nueva instancia (no modifica el original)

Así que su método mergeEntity(..) debe return em.merge(entity)

+0

¡Ja! mi mal, lo perdí totalmente, gracias, funciona ahora. – Rakesh

+0

de nada. Es un error común. – Bozho

0

como su ID es fijado por la base de datos, JPA/Hibernate sólo puede configurarlo después de la instrucción SQL había sido enviado a la base de datos. Si configura Hibernate para visualizar la instrucción sql o si cambia el registro a DEBUG, probablemente verá que no se emite ninguna instrucción SQL cuando llama al mergeEntity.

Una manera de hacer su trabajo de pruebas debe ser agregar em.flush() antes de hacer la afirmación sobre la Identificación del niño.

podría mayo un problema la forma de gestionar la transacción, sino que requerirá para ver el código de la DAO y la manera de obtener una referencia a la DAO en su unidad de prueba.

+0

@Transactional (propagación = Propagation.REQUIRED) \t mergeEntity objeto público (entidad Object) { \t \t em.merge retorno (entidad); \t} – Rakesh

Cuestiones relacionadas