1

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

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),并且永远不会创建捆绑包或将其添加给用户。我还尝试在我的 UserEntityem.persist(user)em.flush()设置 cascadeType ,但没​​有成功。

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

谢谢!

4

1 回答 1

3

你知道这个:

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

是非常糟糕的做法,对吧?也许,这就是问题所在,你遇到了 NPE,却从未注意到它。

您至少应该记录异常以了解那里发生了什么(仅出于演示目的,我使用了标准输出,请替换为您最喜欢的日志记录框架):

try {
    addItemToBundle(item);
} catch (NullPointerException e) {
    System.err.println(e.getMessage()); //use logger here
}
于 2012-05-03T13:39:10.567 回答