JPA @OneToMany不持久/级联

时间:2012-05-03 13:21:47

标签: jpa jsf-2 primefaces persistence eclipselink

我在Session Scoped Bean中的UserController中有以下代码

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;
}

此代码使用private ItemEntity item;,它由以下JSF标记传递:

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

(我在这个例子中使用的是PrimeFaces)问题是addItemToBundle没有调用控制台中的任何SQL代码(我启用了FINE),并且永远不会创建或添加用户包。我还尝试了em.persist(user)em.flush()并在我的UserEntity中设置了cascadeType而没有运气。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

你知道这个:

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

是非常糟糕的做法,对吗?也许,这就是问题所在,你遇到了一个N​​PE,从来没有注意到它。

你至少应该记录异常才知道那里发生了什么(仅用于演示目的,我使用过stdout,请替换你最喜欢的日志框架):

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