JPA @OneToMany no persistente/en cascada

Tengo el siguiente código en UserController en mi frijol de ámbito de sesión

public void addItemToBundle(ItemEntity item){
    //System.out.println(item.getTitle());
    try {
        em.getTransaction().begin();
        UserEntity user = em.find(UserEntity.class, this.username);
        BundleEntity bundle = new BundleEntity();
        BundleEntityPK compositePk = new BundleEntityPK();
        compositePk.setCheckedOutDate(new Date());
        compositePk.setItemId(item.getItemId());
        compositePk.setUsername(user.getUsername());
        bundle.setId(compositePk);
        Set<BundleEntity> bundles = new HashSet<BundleEntity>();
        bundles.add(bundle);
        user.setBundleEntities(bundles);        
        em.persist(user);
        em.flush();
        em.getTransaction().commit();
    } finally {
    }
}


public String addToBundle(){        
    try {
        addItemToBundle(item);
    } catch (NullPointerException e) {
        e.getMessage();
    }

    return null;
}

Este código usa private ItemEntity item; que se pasa por el siguiente marcado JSF:

<p:commandLink action="#{itemController.item}">
    <f:setPropertyActionListener target="#{itemController.selectedItem}" value="#{movie}" />
</p:commandLink>

(Estoy usando PrimeFaces en este ejemplo) El problema es que el addItemToBundle no está llamando a ningún código SQL en la consola (tengo FINE habilitado) y el paquete nunca se crea ni se agrega al usuario. yo también probé em.persist(user) y em.flush() y configurando cascadeType en mi UserEntity sin suerte.

@OneToMany(mappedBy="userEntity",cascade=CascadeType.PERSIST)
private Set<BundleEntity> bundleEntities;

¡Gracias!

preguntado el 03 de mayo de 12 a las 14:05

1 Respuestas

Sabes que esto:

try {
    addItemToBundle(item);
} catch (NullPointerException e) {
    e.getMessage();
}

es muy mala practica no? Tal vez, ese es el problema aquí, te encuentras con un NPE y nunca lo notas.

Al menos debe registrar la excepción para saber qué está pasando allí (solo para fines de demostración, he usado stdout, reemplácelo con su marco de registro favorito):

try {
    addItemToBundle(item);
} catch (NullPointerException e) {
    System.err.println(e.getMessage()); //use logger here
}

contestado el 03 de mayo de 12 a las 14:05

Esto ayudó de alguna manera, ahora puedo persistir en el paquete pero no de manera consistente. A veces tengo que presionar el botón una vez, otras veces es una vez y otras veces no pasa nada... también, ¿es una buena práctica e.printStackTrace()? ¿o no? - conocido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.